diff options
author | ADAM David Alan Martin <adam.martin@10gen.com> | 2017-06-01 15:19:41 -0400 |
---|---|---|
committer | ADAM David Alan Martin <adam.martin@10gen.com> | 2017-06-01 15:19:41 -0400 |
commit | 13e508be0460174d843dabbcfd4375446d200867 (patch) | |
tree | 40ee591119885d600352d1a71ec278be8d290a4b | |
parent | 6d36b9c90db9fea2c92f90ea7d9775a72b8fa339 (diff) | |
download | mongo-13e508be0460174d843dabbcfd4375446d200867.tar.gz |
SERVER-29315 Fix `clonable_ptr_test` in UBSAN
The `clonable_ptr_test` has several test cases exclusively dedicated
to verifying the syntax of this component. These tests trigger
UBSAN errors on creating a reference to a dereferenced null pointer
even though the pointer is never used. This fix makes the tests
never run (by hiding them behind an if-false block), but still
compile, making them true compile-time-only tests. This is more
consistent with their intended behavior: syntax testing
-rw-r--r-- | src/mongo/base/clonable_ptr.h | 4 | ||||
-rw-r--r-- | src/mongo/base/clonable_ptr_test.cpp | 54 |
2 files changed, 30 insertions, 28 deletions
diff --git a/src/mongo/base/clonable_ptr.h b/src/mongo/base/clonable_ptr.h index 0b718db4d5d..b1913fc1a71 100644 --- a/src/mongo/base/clonable_ptr.h +++ b/src/mongo/base/clonable_ptr.h @@ -1,6 +1,4 @@ -// clonable_ptr.h - -/*- +/** * Copyright (C) 2016 MongoDB Inc. * * This program is free software: you can redistribute it and/or modify diff --git a/src/mongo/base/clonable_ptr_test.cpp b/src/mongo/base/clonable_ptr_test.cpp index 5554f1fbe6a..a7a8f6d12fb 100644 --- a/src/mongo/base/clonable_ptr_test.cpp +++ b/src/mongo/base/clonable_ptr_test.cpp @@ -1,6 +1,4 @@ -// clonable_ptr_test.cpp - -/*- +/** * Copyright (C) 2016 MongoDB Inc. * * This program is free software: you can redistribute it and/or modify @@ -39,6 +37,12 @@ namespace { namespace stdx = mongo::stdx; +template <typename Test> +void runSyntaxTest(Test&& t) { + if (false) + t(); +} + // These testing helper classes model various kinds of class which should be compatible with // `mongo::clonable_ptr`. The basic use cases satisfied by each class are described in each class's // documentation. @@ -421,10 +425,8 @@ void pointerOperations() { } // Test `*` functionality - { - Clonable& r = *a; - (void)r; - } + Clonable& r = *a; + (void)r; // Test reset functionality { @@ -470,33 +472,35 @@ void equalityOperations() { } // namespace SyntaxTests TEST(ClonablePtrSyntaxTests, construction) { - SyntaxTests::construction<ClonableTest>(); - SyntaxTests::construction<AltClonableTest>(); - SyntaxTests::construction<Alt2ClonableTest>(); - SyntaxTests::construction<RawPointerClonable>(); - SyntaxTests::construction<UniquePtrClonable>(); + runSyntaxTest(SyntaxTests::construction<ClonableTest>); + runSyntaxTest(SyntaxTests::construction<AltClonableTest>); + runSyntaxTest(SyntaxTests::construction<Alt2ClonableTest>); + runSyntaxTest(SyntaxTests::construction<RawPointerClonable>); + runSyntaxTest(SyntaxTests::construction<UniquePtrClonable>); } TEST(ClonablePtrSyntaxTests, augmentedConstruction) { - SyntaxTests::augmentedConstruction<FunctorClonable, FunctorClonable::CloningFunctionType>(); - SyntaxTests::augmentedConstruction<FunctorWithDynamicStateClonable, - FunctorWithDynamicStateClonable::CloningFunctionType>(); + runSyntaxTest( + SyntaxTests::augmentedConstruction<FunctorClonable, FunctorClonable::CloningFunctionType>); + runSyntaxTest( + SyntaxTests::augmentedConstruction<FunctorWithDynamicStateClonable, + FunctorWithDynamicStateClonable::CloningFunctionType>); } TEST(ClonablePtrSyntaxTests, pointerOperations) { - SyntaxTests::pointerOperations<ClonableTest>(); - SyntaxTests::pointerOperations<AltClonableTest>(); - SyntaxTests::pointerOperations<Alt2ClonableTest>(); - SyntaxTests::pointerOperations<RawPointerClonable>(); - SyntaxTests::pointerOperations<UniquePtrClonable>(); + runSyntaxTest(SyntaxTests::pointerOperations<ClonableTest>); + runSyntaxTest(SyntaxTests::pointerOperations<AltClonableTest>); + runSyntaxTest(SyntaxTests::pointerOperations<Alt2ClonableTest>); + runSyntaxTest(SyntaxTests::pointerOperations<RawPointerClonable>); + runSyntaxTest(SyntaxTests::pointerOperations<UniquePtrClonable>); } TEST(ClonablePtrSyntaxTests, equalityOperations) { - SyntaxTests::equalityOperations<ClonableTest>(); - SyntaxTests::equalityOperations<AltClonableTest>(); - SyntaxTests::equalityOperations<Alt2ClonableTest>(); - SyntaxTests::equalityOperations<RawPointerClonable>(); - SyntaxTests::equalityOperations<UniquePtrClonable>(); + runSyntaxTest(SyntaxTests::equalityOperations<ClonableTest>); + runSyntaxTest(SyntaxTests::equalityOperations<AltClonableTest>); + runSyntaxTest(SyntaxTests::equalityOperations<Alt2ClonableTest>); + runSyntaxTest(SyntaxTests::equalityOperations<RawPointerClonable>); + runSyntaxTest(SyntaxTests::equalityOperations<UniquePtrClonable>); } namespace BehaviorTests { |