From d134b0cae3033c4ddc027fae6f76c66e8b0a6a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Wed, 2 Jul 2025 07:30:36 -0400 Subject: [PATCH] clang: do not issue bogus warnings about integer manipulation in hash functions with fsanitize=undefined/integer (#2965) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With -fsanitize=integer every over/under-flowing integer manipulation triggers a warning. This is extremely useful as it allows to find some non-obvious bugs such as for(size_t i = 0; i < N - 1; i++) { ... } But it comes with a lot of false positives, for instance with every hash function doing shifting on unsigned integer. Random number generators are also often detected with this sanitizer. This marks a few of these functions as safe in this case. Co-authored-by: Martin Hořeňovský --- src/catch2/internal/catch_random_number_generator.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/catch2/internal/catch_random_number_generator.cpp b/src/catch2/internal/catch_random_number_generator.cpp index c88cd8f2..e46b5fd3 100644 --- a/src/catch2/internal/catch_random_number_generator.cpp +++ b/src/catch2/internal/catch_random_number_generator.cpp @@ -7,6 +7,12 @@ // SPDX-License-Identifier: BSL-1.0 #include +#if defined( __clang__ ) +# define CATCH2_CLANG_NO_SANITIZE_INTEGER \ + __attribute__( ( no_sanitize( "unsigned-integer-overflow" ) ) ) +#else +# define CATCH2_CLANG_NO_SANITIZE_INTEGER +#endif namespace Catch { namespace { @@ -16,6 +22,7 @@ namespace { #pragma warning(disable:4146) // we negate uint32 during the rotate #endif // Safe rotr implementation thanks to John Regehr + CATCH2_CLANG_NO_SANITIZE_INTEGER uint32_t rotate_right(uint32_t val, uint32_t count) { const uint32_t mask = 31; count &= mask; @@ -49,6 +56,7 @@ namespace { } } + CATCH2_CLANG_NO_SANITIZE_INTEGER SimplePcg32::result_type SimplePcg32::operator()() { // prepare the output value const uint32_t xorshifted = static_cast(((m_state >> 18u) ^ m_state) >> 27u);