// 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); }