From a5d279d5e450732af3a7a23c35f7ed648d419ad3 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Wed, 6 May 2026 11:13:02 +0200 Subject: [PATCH] Fix sanitizer use (#1429) * Fix sanitizer use A case issue prevented adding sanitizer in the tests. * Fix compiler warnings from actual sanitizer use --- .devcontainer/run-tests.sh | 2 +- include/etl/private/delegate_cpp11.h | 8 ++++++++ test/run-coverage.sh | 2 +- test/run-tests.sh | 6 +++--- test/test_bsd_checksum.cpp | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.devcontainer/run-tests.sh b/.devcontainer/run-tests.sh index 218dc032..9618a15b 100755 --- a/.devcontainer/run-tests.sh +++ b/.devcontainer/run-tests.sh @@ -41,7 +41,7 @@ elif [ "$2" = "inside_container" ] ; then cd build-$ARCH cmake -DCMAKE_TOOLCHAIN_FILE=../.devcontainer/$ARCH/toolchain-$ARCH.cmake \ -DBUILD_TESTS=ON -DNO_STL=ON -DETL_CXX_STANDARD=23 \ - -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=-O0 -DETL_ENABLE_SANITIZER=Off -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF \ + -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF -DETL_OPTIMISATION=-O0 -DETL_ENABLE_SANITIZER=OFF -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF \ ../test export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) cmake --build . diff --git a/include/etl/private/delegate_cpp11.h b/include/etl/private/delegate_cpp11.h index 9664797b..27b443c0 100644 --- a/include/etl/private/delegate_cpp11.h +++ b/include/etl/private/delegate_cpp11.h @@ -566,6 +566,14 @@ namespace etl //************************************************************************* ETL_NODISCARD ETL_CONSTEXPR14 bool is_valid() const ETL_NOEXCEPT { + // GCC's UBSan instruments function pointer comparisons, which prevents + // constexpr evaluation. Use implicit bool conversion at compile time + // to avoid the instrumented != comparison while still checking validity. + if (etl::is_constant_evaluated()) + { + return static_cast(invocation.stub); + } + return invocation.stub != ETL_NULLPTR; } diff --git a/test/run-coverage.sh b/test/run-coverage.sh index 9266cd1b..bf795262 100755 --- a/test/run-coverage.sh +++ b/test/run-coverage.sh @@ -58,7 +58,7 @@ for CXXSTD in 11 14 17 20 23 26; do -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF \ -DETL_OPTIMISATION=-O0 \ -DETL_CXX_STANDARD=$CXXSTD \ - -DETL_ENABLE_SANITIZER=Off \ + -DETL_ENABLE_SANITIZER=OFF \ -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF \ -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON .. cmake --build . diff --git a/test/run-tests.sh b/test/run-tests.sh index 0381ac75..ba309963 100755 --- a/test/run-tests.sh +++ b/test/run-tests.sh @@ -163,11 +163,11 @@ fi # Set the sanitizer enable. Default OFF #****************************************************************************** if [ "$4" = "s" ]; then - sanitize="On" + sanitize="ON" elif [ "$4" = "n" ]; then - sanitize="Off" + sanitize="OFF" else - sanitize="Off" + sanitize="OFF" fi #****************************************************************************** diff --git a/test/test_bsd_checksum.cpp b/test/test_bsd_checksum.cpp index 9274b112..f95dcf12 100644 --- a/test/test_bsd_checksum.cpp +++ b/test/test_bsd_checksum.cpp @@ -50,7 +50,7 @@ namespace for (size_t i = 0UL; i < sizeof(value_type); ++i) { - uint8_t byte = static_cast((static_cast(value) >> (i * 8UL)) & 0xFFU); + uint8_t byte = static_cast((static_cast(value) >> (i * 8U)) & 0xFFU); checksum = etl::rotate_right(checksum) + byte; } }