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 <common/args.h>6#include <test/fuzz/FuzzedDataProvider.h>7#include <test/fuzz/fuzz.h>8#include <test/fuzz/util.h>9#include <test/util/setup_common.h>11#include <cstdint>12#include <set>13#include <string>14#include <vector>16namespace {17void initialize_system()18{19static const auto testing_setup = MakeNoLogFileContext<>();20}22std::string GetArgumentName(const std::string& name)23{24size_t idx = name.find('=');25if (idx == std::string::npos) {26idx = name.size();27}28return name.substr(0, idx);29}31FUZZ_TARGET(system, .init = initialize_system)32{33FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());34ArgsManager args_manager{};35std::vector<std::string> command_option_names;37if (fuzzed_data_provider.ConsumeBool()) {38SetupHelpOptions(args_manager);39}41LIMITED_WHILE (fuzzed_data_provider.ConsumeBool(), 3000) {42CallOneOf(43fuzzed_data_provider,44[&] {45args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));46},47[&] {48auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);49auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);50args_manager.SoftSetArg(str_arg, str_value);51},52[&] {53auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);54auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);55args_manager.ForceSetArg(str_arg, str_value);56},57[&] {58auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);59auto f_value = fuzzed_data_provider.ConsumeBool();60args_manager.SoftSetBoolArg(str_arg, f_value);61},62[&] {63const OptionsCategory options_category = fuzzed_data_provider.PickValueInArray<OptionsCategory>({OptionsCategory::OPTIONS, OptionsCategory::CONNECTION, OptionsCategory::WALLET, OptionsCategory::WALLET_DEBUG_TEST, OptionsCategory::ZMQ, OptionsCategory::DEBUG_TEST, OptionsCategory::CHAINPARAMS, OptionsCategory::NODE_RELAY, OptionsCategory::BLOCK_CREATION, OptionsCategory::RPC, OptionsCategory::GUI, OptionsCategory::COMMANDS, OptionsCategory::REGISTER_COMMANDS, OptionsCategory::CLI_COMMANDS, OptionsCategory::IPC, OptionsCategory::COMMAND_OPTIONS, OptionsCategory::HIDDEN});64// Avoid hitting:65// common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.66const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));67if (args_manager.GetArgFlags(argument_name) != std::nullopt) {68return;69}70auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);71auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;72args_manager.AddArg(argument_name, help, flags, options_category);73if (options_category == OptionsCategory::COMMAND_OPTIONS) {74command_option_names.push_back(argument_name);75}76},77[&] {78auto cmd = fuzzed_data_provider.ConsumeRandomLengthString(16);79if (cmd.empty() || cmd[0] == '-' || cmd.find('=') != std::string::npos) return;80if (args_manager.GetArgFlags(cmd) != std::nullopt) return;81auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);82std::set<std::string> options;83for (const auto& opt : command_option_names) {84if (fuzzed_data_provider.ConsumeBool()) {85options.insert(opt);86}87}88args_manager.AddCommand(cmd, help, std::move(options));89},90[&] {91// Avoid hitting:92// common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.93const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider);94std::vector<std::string> hidden_arguments;95for (const std::string& name : names) {96const std::string hidden_argument = GetArgumentName(name);97if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) {98continue;99}100if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) {101continue;102}103hidden_arguments.push_back(hidden_argument);104}105args_manager.AddHiddenArgs(hidden_arguments);106},107[&] {108args_manager.ClearArgs();109command_option_names.clear();110},111[&] {112const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider);113std::vector<const char*> argv;114argv.reserve(random_arguments.size());115for (const std::string& random_argument : random_arguments) {116argv.push_back(random_argument.c_str());117}118try {119std::string error;120(void)args_manager.ParseParameters(argv.size(), argv.data(), error);121} catch (const std::logic_error&) {122}123});124}126const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16);127const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16);128const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>();129const bool b = fuzzed_data_provider.ConsumeBool();131(void)args_manager.GetIntArg(s1, i64);132(void)args_manager.GetArg(s1, s2);133(void)args_manager.GetArgFlags(s1);134(void)args_manager.GetArgs(s1);135(void)args_manager.GetBoolArg(s1, b);136try {137(void)args_manager.GetChainTypeString();138} catch (const std::runtime_error&) {139}140(void)args_manager.GetHelpMessage();141const auto command = args_manager.GetCommand();142if (command) {143(void)args_manager.CheckCommandOptions(command->command);144}145(void)args_manager.GetUnrecognizedSections();146(void)args_manager.GetUnsuitableSectionOnlyArgs();147(void)args_manager.IsArgNegated(s1);148(void)args_manager.IsArgSet(s1);150(void)HelpRequested(args_manager);151}152} // namespace
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.