Details
-
Bug
-
Resolution: Fixed
-
Major - P3
-
None
-
None
-
Fully Compatible
-
ALL
-
Platforms 2017-05-29, Platforms 2017-06-19
-
0
Description
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.
404
|
template <typename Clonable> |
405
|
void pointerOperations() { |
406
|
mongo::clonable_ptr<Clonable> a;
|
407
|
|
408
|
// Test `.get()` functionality: |
409
|
{
|
410
|
Clonable* p = a.get();
|
411
|
(void)p; |
412
|
}
|
413
|
|
414
|
// Test `->` functionality |
415
|
{
|
416
|
// We don't actually want to call the dtor, but we want the compiler to check that we |
417
|
// have. |
418
|
if (false) { |
419
|
a->~Clonable();
|
420
|
}
|
421
|
}
|
422
|
|
423
|
// Test `*` functionality |
424
|
{
|
425
|
Clonable& r = *a;
|
426
|
(void)r; |
427
|
}
|