Coverage Report

Created: 2025-03-18 19:34

/root/bitcoin/src/test/fuzz/scriptnum_ops.cpp
Line
Count
Source (jump to first uncovered line)
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
bool IsValidAddition(const CScriptNum& lhs, const CScriptNum& rhs)
17
0
{
18
0
    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);
  Branch (18:12): [True: 0, False: 0]
  Branch (18:25): [True: 0, False: 0]
  Branch (18:36): [True: 0, False: 0]
  Branch (18:102): [True: 0, False: 0]
  Branch (18:113): [True: 0, False: 0]
19
0
}
20
21
bool IsValidSubtraction(const CScriptNum& lhs, const CScriptNum& rhs)
22
0
{
23
0
    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);
  Branch (23:12): [True: 0, False: 0]
  Branch (23:25): [True: 0, False: 0]
  Branch (23:36): [True: 0, False: 0]
  Branch (23:102): [True: 0, False: 0]
  Branch (23:113): [True: 0, False: 0]
24
0
}
25
} // namespace
26
27
FUZZ_TARGET(scriptnum_ops)
28
0
{
29
0
    FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
30
0
    CScriptNum script_num = ConsumeScriptNum(fuzzed_data_provider);
31
0
    LIMITED_WHILE(fuzzed_data_provider.remaining_bytes() > 0, 1000000) {
32
0
        CallOneOf(
33
0
            fuzzed_data_provider,
34
0
            [&] {
35
0
                const int64_t i = fuzzed_data_provider.ConsumeIntegral<int64_t>();
36
0
                assert((script_num == i) != (script_num != i));
37
0
                assert((script_num <= i) != (script_num > i));
38
0
                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
0
                if (IsValidAddition(script_num, CScriptNum{i})) {
  Branch (41:21): [True: 0, False: 0]
42
0
                    assert((script_num + i) - i == script_num);
43
0
                }
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
0
                if (IsValidSubtraction(script_num, CScriptNum{i})) {
  Branch (46:21): [True: 0, False: 0]
47
0
                    assert((script_num - i) + i == script_num);
48
0
                }
49
0
            },
50
0
            [&] {
51
0
                const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
52
0
                assert((script_num == random_script_num) != (script_num != random_script_num));
53
0
                assert((script_num <= random_script_num) != (script_num > random_script_num));
54
0
                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
0
                if (IsValidAddition(script_num, random_script_num)) {
  Branch (57:21): [True: 0, False: 0]
58
0
                    assert((script_num + random_script_num) - random_script_num == script_num);
59
0
                }
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
0
                if (IsValidSubtraction(script_num, random_script_num)) {
  Branch (62:21): [True: 0, False: 0]
63
0
                    assert((script_num - random_script_num) + random_script_num == script_num);
64
0
                }
65
0
            },
66
0
            [&] {
67
0
                const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
68
0
                if (!IsValidAddition(script_num, random_script_num)) {
  Branch (68:21): [True: 0, False: 0]
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
0
                    return;
72
0
                }
73
0
                script_num += random_script_num;
74
0
            },
75
0
            [&] {
76
0
                const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);
77
0
                if (!IsValidSubtraction(script_num, random_script_num)) {
  Branch (77:21): [True: 0, False: 0]
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
0
                    return;
81
0
                }
82
0
                script_num -= random_script_num;
83
0
            },
84
0
            [&] {
85
0
                script_num = script_num & fuzzed_data_provider.ConsumeIntegral<int64_t>();
86
0
            },
87
0
            [&] {
88
0
                script_num = script_num & ConsumeScriptNum(fuzzed_data_provider);
89
0
            },
90
0
            [&] {
91
0
                script_num &= ConsumeScriptNum(fuzzed_data_provider);
92
0
            },
93
0
            [&] {
94
0
                if (script_num == CScriptNum{std::numeric_limits<int64_t>::min()}) {
  Branch (94:21): [True: 0, False: 0]
95
                    // Avoid assertion failure:
96
                    // ./script/script.h:279: CScriptNum CScriptNum::operator-() const: Assertion `m_value != std::numeric_limits<int64_t>::min()' failed.
97
0
                    return;
98
0
                }
99
0
                script_num = -script_num;
100
0
            },
101
0
            [&] {
102
0
                script_num = fuzzed_data_provider.ConsumeIntegral<int64_t>();
103
0
            },
104
0
            [&] {
105
0
                const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();
106
0
                if (!IsValidAddition(script_num, CScriptNum{random_integer})) {
  Branch (106:21): [True: 0, False: 0]
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
0
                    return;
110
0
                }
111
0
                script_num += random_integer;
112
0
            },
113
0
            [&] {
114
0
                const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();
115
0
                if (!IsValidSubtraction(script_num, CScriptNum{random_integer})) {
  Branch (115:21): [True: 0, False: 0]
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
0
                    return;
119
0
                }
120
0
                script_num -= random_integer;
121
0
            },
122
0
            [&] {
123
0
                script_num &= fuzzed_data_provider.ConsumeIntegral<int64_t>();
124
0
            });
125
0
        (void)script_num.getint();
126
0
        (void)script_num.getvch();
127
0
    }
128
0
}