diff --git a/src/test/fuzz/multiplication_overflow.cpp b/src/test/fuzz/multiplication_overflow.cpp index f6f0111c5..8999306fa 100644 --- a/src/test/fuzz/multiplication_overflow.cpp +++ b/src/test/fuzz/multiplication_overflow.cpp @@ -1,42 +1,55 @@ // Copyright (c) 2020 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include +#if defined(__has_builtin) +#if __has_builtin(__builtin_mul_overflow) +#define HAVE_BUILTIN_MUL_OVERFLOW +#endif +#elif defined(__GNUC__) && (__GNUC__ >= 5) +#define HAVE_BUILTIN_MUL_OVERFLOW +#endif + namespace { template void TestMultiplicationOverflow(FuzzedDataProvider &fuzzed_data_provider) { const T i = fuzzed_data_provider.ConsumeIntegral(); const T j = fuzzed_data_provider.ConsumeIntegral(); const bool is_multiplication_overflow_custom = MultiplicationOverflow(i, j); +#if defined(HAVE_BUILTIN_MUL_OVERFLOW) T result_builtin; const bool is_multiplication_overflow_builtin = __builtin_mul_overflow(i, j, &result_builtin); assert(is_multiplication_overflow_custom == is_multiplication_overflow_builtin); if (!is_multiplication_overflow_custom) { assert(i * j == result_builtin); } +#else + if (!is_multiplication_overflow_custom) { + (void)(i * j); + } +#endif } } // namespace void test_one_input(const std::vector &buffer) { FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); TestMultiplicationOverflow(fuzzed_data_provider); - TestMultiplicationOverflow(fuzzed_data_provider); }