From 04d96385decf648a8b6d2b9838f022ad7511d15b Mon Sep 17 00:00:00 2001 From: Franck W Date: Sun, 16 Apr 2023 22:40:14 +0200 Subject: [PATCH] Improved UBSAN support for gcc too + added a macro to disable tests that have to trigger UBSAN. --- include/mockutils/Macros.hpp | 6 ++++++ include/mockutils/VTUtils.hpp | 5 ++--- tests/default_behaviore_tests.cpp | 4 ++++ tests/referece_types_tests.cpp | 30 +++++++++++++++++++++++------- tests/stubbing_tests.cpp | 2 -- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/include/mockutils/Macros.hpp b/include/mockutils/Macros.hpp index d5819113..48a70bcd 100644 --- a/include/mockutils/Macros.hpp +++ b/include/mockutils/Macros.hpp @@ -20,3 +20,9 @@ #else # define FAKEIT_CPLUSPLUS __cplusplus #endif + +#ifdef __GNUG__ +# define FAKEIT_DISARM_UBSAN __attribute__((no_sanitize("undefined"))) +#else +# define FAKEIT_DISARM_UBSAN +#endif diff --git a/include/mockutils/VTUtils.hpp b/include/mockutils/VTUtils.hpp index 1a0c3458..3256b711 100644 --- a/include/mockutils/VTUtils.hpp +++ b/include/mockutils/VTUtils.hpp @@ -10,6 +10,7 @@ #include #include +#include "mockutils/Macros.hpp" #include "mockutils/VirtualOffestSelector.hpp" #include "mockutils/union_cast.hpp" @@ -37,10 +38,8 @@ namespace fakeit { #endif template + FAKEIT_DISARM_UBSAN static typename std::enable_if::value, unsigned int>::type -#if defined(__clang__) -__attribute__((no_sanitize("undefined"))) -#endif getDestructorOffset() { VirtualOffsetSelector offsetSelctor; union_cast(&offsetSelctor)->~C(); diff --git a/tests/default_behaviore_tests.cpp b/tests/default_behaviore_tests.cpp index cfa2a098..6d1d7cf1 100644 --- a/tests/default_behaviore_tests.cpp +++ b/tests/default_behaviore_tests.cpp @@ -22,9 +22,13 @@ struct DefaultBehavioreTests : tpunit::TestFixture { TEST(DefaultBehavioreTests::DefaultBeaviorOfVoidFunctionsIsToDoNothing), // TEST(DefaultBehavioreTests::ReturnByValue_ReturnDefaultConstructedObject), // TEST(DefaultBehavioreTests::ReturnByValue_ThrowExceptionIfNotDefaultConstructible), // +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS TEST(DefaultBehavioreTests::ReturnByReference_ReturnReferenceToNullIfAbstract), // +#endif TEST(DefaultBehavioreTests::ReturnByReference_ReturnReferenceToDefaultConstructedObject), // +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS TEST(DefaultBehavioreTests::ReturnByReference_ReturnReferenceToNullIfNotDefaultConstructible), // +#endif TEST(DefaultBehavioreTests::ReturnPtr_NullPtrIfPtrToAbstract), TEST(DefaultBehavioreTests::production_shared_ptr_mock_used_in_invocation) //TEST(DefaultBehavioreTests::should_survive_delete_of_mock_instance_by_user) diff --git a/tests/referece_types_tests.cpp b/tests/referece_types_tests.cpp index 31e6852e..6c5df9cf 100644 --- a/tests/referece_types_tests.cpp +++ b/tests/referece_types_tests.cpp @@ -57,11 +57,18 @@ struct ReferenceTypesTests: tpunit::TestFixture { void implicitStubbingDefaultReturnValues() { Mock mock; +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS Fake( // Method(mock,returnIntByRef), // Method(mock,returnAbstractTypeByRef), // Method(mock,returnConcreteTypeByRef) // ); +#else + Fake( // + Method(mock,returnIntByRef), // + Method(mock,returnConcreteTypeByRef) // + ); +#endif ReferenceInterface & i = mock.get(); @@ -69,18 +76,22 @@ struct ReferenceTypesTests: tpunit::TestFixture { // Return a reference to the default value. ASSERT_EQUAL(0, i.returnIntByRef()); - // Concrete types types are initiated by default ctor. + // Concrete types are initiated by default ctor. // Return a reference to the default value. ASSERT_EQUAL(ConcreteType(), i.returnConcreteTypeByRef()); +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS // For abstract types return a reference to nullptr. ASSERT_EQUAL(nullptr, &i.returnAbstractTypeByRef()); +#endif } void explicitStubbingDefualtReturnValues() { Mock mock; // When(Method(mock,returnIntByRef)).Return(); // +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS When(Method(mock,returnAbstractTypeByRef)).Return(); // +#endif When(Method(mock,returnConcreteTypeByRef)).Return(); // ReferenceInterface & i = mock.get(); @@ -89,12 +100,14 @@ struct ReferenceTypesTests: tpunit::TestFixture { // Return a reference to the default value. ASSERT_EQUAL(0, i.returnIntByRef()); - // Concrete types types are initiated by default ctor. + // Concrete types are initiated by default ctor. // Return a reference to the default value. ASSERT_EQUAL(ConcreteType(), i.returnConcreteTypeByRef()); +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS // For abstract types return a reference to nullptr. ASSERT_EQUAL(nullptr, &i.returnAbstractTypeByRef()); +#endif } void explicitStubbingReturnValues() { @@ -113,7 +126,7 @@ struct ReferenceTypesTests: tpunit::TestFixture { // Return a reference to the default value. ASSERT_EQUAL(1, i.returnIntByRef()); - // Concrete types types are initiated by default ctor. + // Concrete types are initiated by default ctor. // Return a reference to the default value. ASSERT_EQUAL(&c, &i.returnConcreteTypeByRef()); @@ -137,7 +150,7 @@ struct ReferenceTypesTests: tpunit::TestFixture { // Return a reference to the default value. ASSERT_EQUAL(1, i.returnIntByRef()); - // Concrete types types are initiated by default ctor. + // Concrete types are initiated by default ctor. // Return a reference to the default value. ASSERT_EQUAL(&c, &i.returnConcreteTypeByRef()); @@ -161,7 +174,7 @@ struct ReferenceTypesTests: tpunit::TestFixture { // Return a reference to the default value. ASSERT_EQUAL(1, i.returnIntByRef()); - // Concrete types types are initiated by default ctor. + // Concrete types are initiated by default ctor. // Return a reference to the default value. ASSERT_EQUAL(&c, &i.returnConcreteTypeByRef()); @@ -172,7 +185,9 @@ struct ReferenceTypesTests: tpunit::TestFixture { void explicitStubbingDefualtReturnValues_with_AlwaysReturn() { Mock mock; When(Method(mock,returnIntByRef)).AlwaysReturn(); +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS When(Method(mock,returnAbstractTypeByRef)).AlwaysReturn(); // +#endif When(Method(mock,returnConcreteTypeByRef)).AlwaysReturn(); // ReferenceInterface & i = mock.get(); @@ -181,13 +196,14 @@ struct ReferenceTypesTests: tpunit::TestFixture { // Return a reference to the default value. ASSERT_EQUAL(0, i.returnIntByRef()); - // Concrete types types are initiated by default ctor. + // Concrete types are initiated by default ctor. // Return a reference to the default value. ASSERT_EQUAL(ConcreteType(), i.returnConcreteTypeByRef()); +#ifndef FAKEIT_DISABLE_UBSAN_TRIGGERING_TESTS // For abstract types return a reference to nullptr. ASSERT_EQUAL(nullptr, &i.returnAbstractTypeByRef()); +#endif } } __ReferenceTypesTests; - diff --git a/tests/stubbing_tests.cpp b/tests/stubbing_tests.cpp index e3e35995..bff76c72 100644 --- a/tests/stubbing_tests.cpp +++ b/tests/stubbing_tests.cpp @@ -9,8 +9,6 @@ #include #include -#include "mockutils/Macros.hpp" - #include "tpunit++.hpp" #include "fakeit.hpp"