summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorADAM David Alan Martin <adam.martin@10gen.com>2017-06-01 15:19:41 -0400
committerADAM David Alan Martin <adam.martin@10gen.com>2017-06-01 15:19:41 -0400
commit13e508be0460174d843dabbcfd4375446d200867 (patch)
tree40ee591119885d600352d1a71ec278be8d290a4b
parent6d36b9c90db9fea2c92f90ea7d9775a72b8fa339 (diff)
downloadmongo-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.h4
-rw-r--r--src/mongo/base/clonable_ptr_test.cpp54
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 {