Bitcoin Core 32.1.0
P2P Digital Currency
Loading...
Searching...
No Matches
system.cpp
Go to the documentation of this file.
1// Copyright (c) 2020-present 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 <common/args.h>
7#include <test/fuzz/fuzz.h>
8#include <test/fuzz/util.h>
10
11#include <cstdint>
12#include <set>
13#include <string>
14#include <vector>
15
16namespace {
17void initialize_system()
18{
19 static const auto testing_setup = MakeNoLogFileContext<>();
20}
21
22std::string GetArgumentName(const std::string& name)
23{
24 size_t idx = name.find('=');
25 if (idx == std::string::npos) {
26 idx = name.size();
27 }
28 return name.substr(0, idx);
29}
30
31FUZZ_TARGET(system, .init = initialize_system)
32{
33 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
34 ArgsManager args_manager{};
35 std::vector<std::string> command_option_names;
36
37 if (fuzzed_data_provider.ConsumeBool()) {
38 SetupHelpOptions(args_manager);
39 }
40
41 LIMITED_WHILE (fuzzed_data_provider.ConsumeBool(), 3000) {
43 fuzzed_data_provider,
44 [&] {
45 args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
46 },
47 [&] {
48 auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
49 auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
50 args_manager.SoftSetArg(str_arg, str_value);
51 },
52 [&] {
53 auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
54 auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
55 args_manager.ForceSetArg(str_arg, str_value);
56 },
57 [&] {
58 auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
59 auto f_value = fuzzed_data_provider.ConsumeBool();
60 args_manager.SoftSetBoolArg(str_arg, f_value);
61 },
62 [&] {
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.
66 const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
67 if (args_manager.GetArgFlags(argument_name) != std::nullopt) {
68 return;
69 }
70 auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
71 auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;
72 args_manager.AddArg(argument_name, help, flags, options_category);
73 if (options_category == OptionsCategory::COMMAND_OPTIONS) {
74 command_option_names.push_back(argument_name);
75 }
76 },
77 [&] {
78 auto cmd = fuzzed_data_provider.ConsumeRandomLengthString(16);
79 if (cmd.empty() || cmd[0] == '-' || cmd.find('=') != std::string::npos) return;
80 if (args_manager.GetArgFlags(cmd) != std::nullopt) return;
81 auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
82 std::set<std::string> options;
83 for (const auto& opt : command_option_names) {
84 if (fuzzed_data_provider.ConsumeBool()) {
85 options.insert(opt);
86 }
87 }
88 args_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.
93 const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider);
94 std::vector<std::string> hidden_arguments;
95 for (const std::string& name : names) {
96 const std::string hidden_argument = GetArgumentName(name);
97 if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) {
98 continue;
99 }
100 if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) {
101 continue;
102 }
103 hidden_arguments.push_back(hidden_argument);
104 }
105 args_manager.AddHiddenArgs(hidden_arguments);
106 },
107 [&] {
108 args_manager.ClearArgs();
109 command_option_names.clear();
110 },
111 [&] {
112 const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider);
113 std::vector<const char*> argv;
114 argv.reserve(random_arguments.size());
115 for (const std::string& random_argument : random_arguments) {
116 argv.push_back(random_argument.c_str());
117 }
118 try {
119 std::string error;
120 (void)args_manager.ParseParameters(argv.size(), argv.data(), error);
121 } catch (const std::logic_error&) {
122 }
123 });
124 }
125
126 const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16);
127 const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16);
128 const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>();
129 const bool b = fuzzed_data_provider.ConsumeBool();
130
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);
136 try {
137 (void)args_manager.GetChainTypeString();
138 } catch (const std::runtime_error&) {
139 }
140 (void)args_manager.GetHelpMessage();
141 const auto command = args_manager.GetCommand();
142 if (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);
149
150 (void)HelpRequested(args_manager);
151}
152} // namespace
bool HelpRequested(const ArgsManager &args)
Definition args.cpp:812
void SetupHelpOptions(ArgsManager &args)
Add help options to the args manager.
Definition args.cpp:817
OptionsCategory
Definition args.h:53
@ WALLET_DEBUG_TEST
Definition args.h:57
@ REGISTER_COMMANDS
Definition args.h:66
@ BLOCK_CREATION
Definition args.h:62
@ COMMAND_OPTIONS
Definition args.h:72
const auto cmd
const auto command
bool ParseParameters(int argc, const char *const argv[], std::string &error) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Definition args.cpp:175
std::vector< std::string > GetArgs(const std::string &strArg) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return a vector of strings of the given argument.
Definition args.cpp:422
@ COMMAND
Definition args.h:131
std::list< SectionInfo > GetUnrecognizedSections() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Log warnings for unrecognized section names in the config file.
Definition args.cpp:152
bool CheckCommandOptions(const std::string &command, std::vector< std::string > *errors=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Check that any command-specific options the user specified are valid for the given command.
Definition args.cpp:388
void AddCommand(const std::string &cmd, const std::string &help, std::set< std::string > options={}) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Add command.
Definition args.cpp:633
bool SoftSetArg(const std::string &strArg, const std::string &strValue) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Set an argument if it doesn't already have a value.
Definition args.cpp:611
std::set< std::string > GetUnsuitableSectionOnlyArgs() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Log warnings for options in m_section_only_args when they are specified in the default section but no...
Definition args.cpp:132
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Add argument.
Definition args.cpp:657
void ForceSetArg(const std::string &strArg, const std::string &strValue) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Definition args.cpp:627
std::string GetArg(const std::string &strArg, const std::string &strDefault) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return string argument or default value.
Definition args.cpp:517
void AddHiddenArgs(const std::vector< std::string > &args) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Add many hidden arguments.
Definition args.cpp:686
std::string GetChainTypeString() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Returns the appropriate chain type string from the program arguments.
Definition args.cpp:917
void ClearArgs() EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Clear available arguments.
Definition args.cpp:693
bool IsArgSet(const std::string &strArg) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return true if the given argument has been manually set.
Definition args.cpp:431
std::optional< const Command > GetCommand() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get the command and command args (returns std::nullopt if no command provided).
Definition args.cpp:368
bool SoftSetBoolArg(const std::string &strArg, bool fValue) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Set a boolean argument if it doesn't already have a value.
Definition args.cpp:619
bool IsArgNegated(const std::string &strArg) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return true if the argument was originally passed as a negated option, i.e.
Definition args.cpp:512
std::optional< unsigned int > GetArgFlags(const std::string &name) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return Flags for known arg.
Definition args.cpp:268
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Definition args.h:323
bool GetBoolArg(const std::string &strArg, bool fDefault) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Return boolean argument or default value.
Definition args.cpp:571
void SelectConfigNetwork(const std::string &network) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Select the network in use.
Definition args.cpp:169
std::string GetHelpMessage() const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get the help string.
Definition args.cpp:720
#define FUZZ_TARGET(...)
Definition fuzz.h:35
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition fuzz.h:22
Definition basic.cpp:11
std::unique_ptr< T > MakeNoLogFileContext(const ChainType chain_type=ChainType::REGTEST, TestOpts opts={})
Make a test setup that has disk access to the debug.log file disabled.
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
Definition util.h:37
std::vector< std::string > ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, const size_t max_vector_size=16, const size_t max_string_length=16) noexcept
Definition util.h:79