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 <script/script.h>
6 : : #include <test/fuzz/FuzzedDataProvider.h>
7 : : #include <test/fuzz/fuzz.h>
8 : : #include <test/fuzz/util.h>
9 : :
10 : : #include <cassert>
11 : : #include <cstdint>
12 : : #include <limits>
13 : : #include <vector>
14 : :
15 : : namespace {
16 : 136393 : bool IsValidAddition(const CScriptNum& lhs, const CScriptNum& rhs)
17 : : {
18 [ + + + + : 136393 : return rhs == 0 || (rhs > 0 && lhs <= CScriptNum{std::numeric_limits<int64_t>::max()} - rhs) || (rhs < 0 && lhs >= CScriptNum{std::numeric_limits<int64_t>::min()} - rhs);
+ + + + +
+ ]
19 : : }
20 : :
21 : 144630 : bool IsValidSubtraction(const CScriptNum& lhs, const CScriptNum& rhs)
22 : : {
23 [ + + + + : 144630 : return rhs == 0 || (rhs > 0 && lhs >= CScriptNum{std::numeric_limits<int64_t>::min()} + rhs) || (rhs < 0 && lhs <= CScriptNum{std::numeric_limits<int64_t>::max()} + rhs);
+ + + + +
+ ]
24 : : }
25 : : } // namespace
26 : :
27 [ + - ]: 558 : FUZZ_TARGET(scriptnum_ops)
28 : : {
29 : 116 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
30 : 116 : CScriptNum script_num = ConsumeScriptNum(fuzzed_data_provider);
31 [ + + + - ]: 240150 : LIMITED_WHILE(fuzzed_data_provider.remaining_bytes() > 0, 1000000) {
32 : 240034 : CallOneOf(
33 : : fuzzed_data_provider,
34 : 94877 : [&] {
35 : 94877 : const int64_t i = fuzzed_data_provider.ConsumeIntegral<int64_t>();
36 [ - + ]: 94877 : assert((script_num == i) != (script_num != i));
37 [ - + ]: 94877 : assert((script_num <= i) != (script_num > i));
38 [ - + ]: 94877 : assert((script_num >= i) != (script_num < i));
39 : : // Avoid signed integer overflow:
40 : : // script/script.h:264:93: runtime error: signed integer overflow: -2261405121394637306 + -9223372036854775802 cannot be represented in type 'long'
41 [ + + ]: 94877 : if (IsValidAddition(script_num, CScriptNum{i})) {
42 : 46547 : assert((script_num + i) - i == script_num);
43 : : }
44 : : // Avoid signed integer overflow:
45 : : // script/script.h:265:93: runtime error: signed integer overflow: 9223371895120855039 - -9223372036854710486 cannot be represented in type 'long'
46 [ + + ]: 94877 : if (IsValidSubtraction(script_num, CScriptNum{i})) {
47 : 56042 : assert((script_num - i) + i == script_num);
48 : : }
49 : 94877 : },
50 : 9102 : [&] {
51 : 9102 : const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
52 [ - + ]: 9102 : assert((script_num == random_script_num) != (script_num != random_script_num));
53 [ - + ]: 9102 : assert((script_num <= random_script_num) != (script_num > random_script_num));
54 [ - + ]: 9102 : assert((script_num >= random_script_num) != (script_num < random_script_num));
55 : : // Avoid signed integer overflow:
56 : : // script/script.h:264:93: runtime error: signed integer overflow: -9223126527765971126 + -9223372036854756825 cannot be represented in type 'long'
57 [ + + ]: 9102 : if (IsValidAddition(script_num, random_script_num)) {
58 : 5972 : assert((script_num + random_script_num) - random_script_num == script_num);
59 : : }
60 : : // Avoid signed integer overflow:
61 : : // script/script.h:265:93: runtime error: signed integer overflow: 6052837899185946624 - -9223372036854775808 cannot be represented in type 'long'
62 [ + + ]: 9102 : if (IsValidSubtraction(script_num, random_script_num)) {
63 : 6274 : assert((script_num - random_script_num) + random_script_num == script_num);
64 : : }
65 : 9102 : },
66 : 19486 : [&] {
67 : 19486 : const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
68 [ + + ]: 19486 : if (!IsValidAddition(script_num, random_script_num)) {
69 : : // Avoid assertion failure:
70 : : // ./script/script.h:292: CScriptNum &CScriptNum::operator+=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)' failed.
71 : : return;
72 : : }
73 : 14566 : script_num += random_script_num;
74 : : },
75 : 29453 : [&] {
76 : 29453 : const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
77 [ + + ]: 29453 : if (!IsValidSubtraction(script_num, random_script_num)) {
78 : : // Avoid assertion failure:
79 : : // ./script/script.h:300: CScriptNum &CScriptNum::operator-=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)' failed.
80 : : return;
81 : : }
82 : 14545 : script_num -= random_script_num;
83 : : },
84 : 7332 : [&] {
85 : 7332 : script_num = script_num & fuzzed_data_provider.ConsumeIntegral<int64_t>();
86 : 7332 : },
87 : 6011 : [&] {
88 : 6011 : script_num = script_num & ConsumeScriptNum(fuzzed_data_provider);
89 : 6011 : },
90 : 6226 : [&] {
91 : 6226 : script_num &= ConsumeScriptNum(fuzzed_data_provider);
92 : 6226 : },
93 : 30157 : [&] {
94 [ + + ]: 30157 : if (script_num == CScriptNum{std::numeric_limits<int64_t>::min()}) {
95 : : // Avoid assertion failure:
96 : : // ./script/script.h:279: CScriptNum CScriptNum::operator-() const: Assertion `m_value != std::numeric_limits<int64_t>::min()' failed.
97 : : return;
98 : : }
99 : 29397 : script_num = -script_num;
100 : : },
101 : 9129 : [&] {
102 : 9129 : script_num = fuzzed_data_provider.ConsumeIntegral<int64_t>();
103 : 9129 : },
104 : 12928 : [&] {
105 : 12928 : const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();
106 [ + + ]: 12928 : if (!IsValidAddition(script_num, CScriptNum{random_integer})) {
107 : : // Avoid assertion failure:
108 : : // ./script/script.h:292: CScriptNum &CScriptNum::operator+=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)' failed.
109 : : return;
110 : : }
111 : 9436 : script_num += random_integer;
112 : : },
113 : 11198 : [&] {
114 : 11198 : const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();
115 [ + + ]: 11198 : if (!IsValidSubtraction(script_num, CScriptNum{random_integer})) {
116 : : // Avoid assertion failure:
117 : : // ./script/script.h:300: CScriptNum &CScriptNum::operator-=(const int64_t &): Assertion `rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)' failed.
118 : : return;
119 : : }
120 : 6752 : script_num -= random_integer;
121 : : },
122 : 4135 : [&] {
123 : 4135 : script_num &= fuzzed_data_provider.ConsumeIntegral<int64_t>();
124 : 4135 : });
125 : 240034 : (void)script_num.getint();
126 : 240034 : (void)script_num.getvch();
127 : : }
128 : 116 : }
|