multiplication_overflow.cpp
1 // Copyright (c) 2020-2021 The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #include <test/fuzz/FuzzedDataProvider.h> 6 #include <test/fuzz/fuzz.h> 7 #include <test/fuzz/util.h> 8 9 #include <cstdint> 10 #include <string> 11 #include <vector> 12 13 namespace { 14 template <typename T> 15 void TestMultiplicationOverflow(FuzzedDataProvider& fuzzed_data_provider) 16 { 17 const T i = fuzzed_data_provider.ConsumeIntegral<T>(); 18 const T j = fuzzed_data_provider.ConsumeIntegral<T>(); 19 const bool is_multiplication_overflow_custom = MultiplicationOverflow(i, j); 20 T result_builtin; 21 const bool is_multiplication_overflow_builtin = __builtin_mul_overflow(i, j, &result_builtin); 22 assert(is_multiplication_overflow_custom == is_multiplication_overflow_builtin); 23 if (!is_multiplication_overflow_custom) { 24 assert(i * j == result_builtin); 25 } 26 } 27 } // namespace 28 29 FUZZ_TARGET(multiplication_overflow) 30 { 31 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 32 TestMultiplicationOverflow<int64_t>(fuzzed_data_provider); 33 TestMultiplicationOverflow<uint64_t>(fuzzed_data_provider); 34 TestMultiplicationOverflow<int32_t>(fuzzed_data_provider); 35 TestMultiplicationOverflow<uint32_t>(fuzzed_data_provider); 36 TestMultiplicationOverflow<int16_t>(fuzzed_data_provider); 37 TestMultiplicationOverflow<uint16_t>(fuzzed_data_provider); 38 TestMultiplicationOverflow<char>(fuzzed_data_provider); 39 TestMultiplicationOverflow<unsigned char>(fuzzed_data_provider); 40 TestMultiplicationOverflow<signed char>(fuzzed_data_provider); 41 }