Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2020-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <script/script.h>6#include <test/fuzz/FuzzedDataProvider.h>7#include <test/fuzz/fuzz.h>8#include <test/fuzz/util.h>10#include <cassert>11#include <cstdint>12#include <limits>13#include <vector>15namespace {16bool IsValidAddition(const CScriptNum& lhs, const CScriptNum& rhs)17{18return 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}21bool IsValidSubtraction(const CScriptNum& lhs, const CScriptNum& rhs)22{23return 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} // namespace27FUZZ_TARGET(scriptnum_ops)28{29FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());30CScriptNum script_num = ConsumeScriptNum(fuzzed_data_provider);31LIMITED_WHILE (fuzzed_data_provider.remaining_bytes() > 0, 1000000) {32CallOneOf(33fuzzed_data_provider,34[&] {35const int64_t i = fuzzed_data_provider.ConsumeIntegral<int64_t>();36assert((script_num == i) != (script_num != i));37assert((script_num <= i) != (script_num > i));38assert((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'41if (IsValidAddition(script_num, CScriptNum{i})) {42assert((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'46if (IsValidSubtraction(script_num, CScriptNum{i})) {47assert((script_num - i) + i == script_num);48}49},50[&] {51const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);52assert((script_num == random_script_num) != (script_num != random_script_num));53assert((script_num <= random_script_num) != (script_num > random_script_num));54assert((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'57if (IsValidAddition(script_num, random_script_num)) {58assert((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'62if (IsValidSubtraction(script_num, random_script_num)) {63assert((script_num - random_script_num) + random_script_num == script_num);64}65},66[&] {67const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);68if (!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.71return;72}73script_num += random_script_num;74},75[&] {76const CScriptNum random_script_num = ConsumeScriptNum(fuzzed_data_provider);77if (!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.80return;81}82script_num -= random_script_num;83},84[&] {85script_num = script_num & fuzzed_data_provider.ConsumeIntegral<int64_t>();86},87[&] {88script_num = script_num & ConsumeScriptNum(fuzzed_data_provider);89},90[&] {91script_num &= ConsumeScriptNum(fuzzed_data_provider);92},93[&] {94if (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.97return;98}99script_num = -script_num;100},101[&] {102script_num = fuzzed_data_provider.ConsumeIntegral<int64_t>();103},104[&] {105const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();106if (!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.109return;110}111script_num += random_integer;112},113[&] {114const int64_t random_integer = fuzzed_data_provider.ConsumeIntegral<int64_t>();115if (!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.118return;119}120script_num -= random_integer;121},122[&] {123script_num &= fuzzed_data_provider.ConsumeIntegral<int64_t>();124});125(void)script_num.getint();126(void)script_num.getvch();127}128}
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.