-
Type: Bug
-
Resolution: Fixed
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: Internal Code
-
Labels:None
-
Fully Compatible
-
ALL
-
Platforms 2017-05-29, Platforms 2017-06-19
-
0
This came up in the UBSAN builder:
[cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.328+0000 Starting Program build/optdebug/mongo/base/clonable_ptr_test under executor with_server... build/optdebug/mongo/base/clonable_ptr_test [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.349+0000 Program build/optdebug/mongo/base/clonable_ptr_test started with pid 10682. [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.406+0000 2017-05-20T19:35:07.406+0000 I - [main] going to run suite: ClonablePtrSimpleTest [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.406+0000 2017-05-20T19:35:07.406+0000 I - [main] going to run test: simpleUsageExample [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.406+0000 /opt/mongodbtoolchain/v2/bin/../lib/gcc/x86_64-mongodb-linux/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:291:9: runtime error: reference binding to null pointer of type '(anonymous namespace)::ClonableTest' [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.407+0000 2017-05-20T19:35:07.406+0000 I - [main] DONE running tests [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.407+0000 2017-05-20T19:35:07.406+0000 I - [main] going to run suite: ClonablePtrSyntaxTests [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.407+0000 2017-05-20T19:35:07.406+0000 I - [main] going to run test: construction [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.407+0000 2017-05-20T19:35:07.406+0000 I - [main] going to run test: augmentedConstruction [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:07.408+0000 2017-05-20T19:35:07.406+0000 I - [main] going to run test: pointerOperations [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.037+0000 #0 0x559de5aa818d in std::unique_ptr<(anonymous namespace)::ClonableTest, std::default_delete<(anonymous namespace)::ClonableTest> >::operator*() const /opt/mongodbtoolchain/v2/bin/../lib/gcc/x86_64-mongodb-linux/5.4.0/../../../../include/c++/5.4.0/bits/unique_ptr.h:291:2 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.037+0000 #1 0x559de5aa818d in mongo::clonable_ptr<(anonymous namespace)::ClonableTest, mongo::clonable_ptr_detail::CloneFactory<(anonymous namespace)::ClonableTest>, std::unique_ptr>::operator*() const /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/base/clonable_ptr.h:434 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.038+0000 #2 0x559de5aa818d in void (anonymous namespace)::SyntaxTests::pointerOperations<(anonymous namespace)::ClonableTest>() /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/base/clonable_ptr_test.cpp:425 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.038+0000 #3 0x559de5aa818d in (anonymous namespace)::UnitTest__ClonablePtrSyntaxTests__pointerOperations::_doTest() /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/base/clonable_ptr_test.cpp:487 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.040+0000 #4 0x559de5ab8f9d in mongo::unittest::Test::run() /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/unittest/unittest.cpp:175:9 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.040+0000 #5 0x559de5aa7fda in void mongo::unittest::Suite::runTestObject<(anonymous namespace)::UnitTest__ClonablePtrSyntaxTests__pointerOperations>() /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/unittest/unittest.h:429:17 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.041+0000 #6 0x559de5aba9d8 in mongo::unittest::TestHolder::run() const /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/unittest/unittest.h:270:9 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.042+0000 #7 0x559de5aba9d8 in mongo::unittest::Suite::run(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/unittest/unittest.cpp:292 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.042+0000 #8 0x559de5abbee9 in mongo::unittest::Suite::run(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/unittest/unittest.cpp:350:30 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.043+0000 #9 0x559de5ab0fe9 in main /data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/src/mongo/unittest/unittest_main.cpp:41:12 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.312+0000 #10 0x7f4f6f9ba82f in __libc_start_main /build/glibc-9tT8Do/glibc-2.23/csu/../csu/libc-start.c:291 [cpp_unit_test:clonable_ptr_test] 2017-05-20T19:35:08.312+0000 #11 0x559de5a83e38 in _start (/data/mci/8cb05daaa5d41bd419de8c480469ce0d/src/build/optdebug/mongo/base/clonable_ptr_test+0x348e38)
I think we can simply provide a valid object for the smart pointer on line 406 to resolve this UBSAN error.
template <typename Clonable> void pointerOperations() { mongo::clonable_ptr<Clonable> a; // Test `.get()` functionality: { Clonable* p = a.get(); (void)p; } // Test `->` functionality { // We don't actually want to call the dtor, but we want the compiler to check that we // have. if (false) { a->~Clonable(); } } // Test `*` functionality { Clonable& r = *a; (void)r; }