Branch data Line data Source code
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 : 918 : void TestMultiplicationOverflow(FuzzedDataProvider& fuzzed_data_provider)
16 : : {
17 : 918 : const T i = fuzzed_data_provider.ConsumeIntegral<T>();
18 : 918 : const T j = fuzzed_data_provider.ConsumeIntegral<T>();
19 : 918 : const bool is_multiplication_overflow_custom = MultiplicationOverflow(i, j);
20 : : #ifndef _MSC_VER
21 : : T result_builtin;
22 : 918 : const bool is_multiplication_overflow_builtin = __builtin_mul_overflow(i, j, &result_builtin);
23 [ - + ]: 918 : assert(is_multiplication_overflow_custom == is_multiplication_overflow_builtin);
24 [ + + ]: 918 : if (!is_multiplication_overflow_custom) {
25 [ - + ]: 337 : assert(i * j == result_builtin);
26 : : }
27 : : #else
28 : : if (!is_multiplication_overflow_custom) {
29 : : (void)(i * j);
30 : : }
31 : : #endif
32 : 918 : }
33 : : } // namespace
34 : :
35 [ + - ]: 514 : FUZZ_TARGET(multiplication_overflow)
36 : : {
37 : 102 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
38 : 102 : TestMultiplicationOverflow<int64_t>(fuzzed_data_provider);
39 : 102 : TestMultiplicationOverflow<uint64_t>(fuzzed_data_provider);
40 : 102 : TestMultiplicationOverflow<int32_t>(fuzzed_data_provider);
41 : 102 : TestMultiplicationOverflow<uint32_t>(fuzzed_data_provider);
42 : 102 : TestMultiplicationOverflow<int16_t>(fuzzed_data_provider);
43 : 102 : TestMultiplicationOverflow<uint16_t>(fuzzed_data_provider);
44 : 102 : TestMultiplicationOverflow<char>(fuzzed_data_provider);
45 : 102 : TestMultiplicationOverflow<unsigned char>(fuzzed_data_provider);
46 : 102 : TestMultiplicationOverflow<signed char>(fuzzed_data_provider);
47 : 102 : }
|