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 <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>
10 : :
11 : : #include <cstdint>
12 : : #include <string>
13 : : #include <vector>
14 : :
15 : : namespace {
16 : 1 : void initialize_system()
17 : : {
18 [ + - + - : 1 : static const auto testing_setup = MakeNoLogFileContext<>();
+ - ]
19 : 1 : }
20 : :
21 : 176153 : std::string GetArgumentName(const std::string& name)
22 : : {
23 : 176153 : size_t idx = name.find('=');
24 [ + + ]: 176153 : if (idx == std::string::npos) {
25 [ - + ]: 155942 : idx = name.size();
26 : : }
27 : 176153 : return name.substr(0, idx);
28 : : }
29 : :
30 [ + - ]: 1198 : FUZZ_TARGET(system, .init = initialize_system)
31 : : {
32 : 742 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
33 : 742 : ArgsManager args_manager{};
34 : :
35 [ + + ]: 742 : if (fuzzed_data_provider.ConsumeBool()) {
36 [ + - ]: 562 : SetupHelpOptions(args_manager);
37 : : }
38 : :
39 [ + + + + ]: 303858 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 3000)
40 : : {
41 [ + - ]: 303116 : CallOneOf(
42 : : fuzzed_data_provider,
43 : 1868 : [&] {
44 [ + - ]: 1868 : args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
45 : 1868 : },
46 : 26945 : [&] {
47 : 26945 : auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
48 [ + - ]: 26945 : auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
49 [ + - ]: 26945 : args_manager.SoftSetArg(str_arg, str_value);
50 : 26945 : },
51 : 2617 : [&] {
52 : 2617 : auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
53 [ + - ]: 2617 : auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
54 [ + - ]: 2617 : args_manager.ForceSetArg(str_arg, str_value);
55 : 2617 : },
56 : 50743 : [&] {
57 : 50743 : auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
58 : 50743 : auto f_value = fuzzed_data_provider.ConsumeBool();
59 [ + - ]: 50743 : args_manager.SoftSetBoolArg(str_arg, f_value);
60 : 50743 : },
61 : 24450 : [&] {
62 : 24450 : const 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::HIDDEN});
63 : : // Avoid hitting:
64 : : // common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
65 [ + - ]: 24450 : const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
66 [ + - + + ]: 24450 : if (args_manager.GetArgFlags(argument_name) != std::nullopt) {
67 : 935 : return;
68 : : }
69 [ + - ]: 23515 : auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
70 : 23515 : auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;
71 [ + - ]: 23515 : args_manager.AddArg(argument_name, help, flags, options_category);
72 : 24450 : },
73 : 16540 : [&] {
74 : : // Avoid hitting:
75 : : // common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
76 : 16540 : const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider);
77 : 16540 : std::vector<std::string> hidden_arguments;
78 [ + + ]: 168243 : for (const std::string& name : names) {
79 [ + - ]: 151703 : const std::string hidden_argument = GetArgumentName(name);
80 [ + - + + ]: 151703 : if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) {
81 : 46071 : continue;
82 : : }
83 [ + + ]: 105632 : if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) {
84 : 19465 : continue;
85 : : }
86 [ + - ]: 86167 : hidden_arguments.push_back(hidden_argument);
87 : 151703 : }
88 [ + - ]: 16540 : args_manager.AddHiddenArgs(hidden_arguments);
89 : 16540 : },
90 : 9609 : [&] {
91 : 9609 : args_manager.ClearArgs();
92 : 9609 : },
93 : 170344 : [&] {
94 : 170344 : const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider);
95 : 170344 : std::vector<const char*> argv;
96 [ - + + - ]: 170344 : argv.reserve(random_arguments.size());
97 [ + + ]: 1168150 : for (const std::string& random_argument : random_arguments) {
98 [ + - ]: 997806 : argv.push_back(random_argument.c_str());
99 : : }
100 : 170344 : try {
101 [ - + ]: 170344 : std::string error;
102 [ - + + - ]: 170344 : (void)args_manager.ParseParameters(argv.size(), argv.data(), error);
103 [ - - ]: 170344 : } catch (const std::logic_error&) {
104 : 0 : }
105 : 170344 : });
106 : : }
107 : :
108 [ + - ]: 742 : const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16);
109 [ + - ]: 742 : const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16);
110 : 742 : const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>();
111 : 742 : const bool b = fuzzed_data_provider.ConsumeBool();
112 : :
113 [ + - ]: 742 : (void)args_manager.GetIntArg(s1, i64);
114 [ + - ]: 742 : (void)args_manager.GetArg(s1, s2);
115 [ + - ]: 742 : (void)args_manager.GetArgFlags(s1);
116 [ + - ]: 742 : (void)args_manager.GetArgs(s1);
117 [ + - ]: 742 : (void)args_manager.GetBoolArg(s1, b);
118 : 742 : try {
119 [ + + ]: 1471 : (void)args_manager.GetChainTypeString();
120 [ - + ]: 13 : } catch (const std::runtime_error&) {
121 : 13 : }
122 [ + - ]: 742 : (void)args_manager.GetHelpMessage();
123 [ + - ]: 742 : (void)args_manager.GetUnrecognizedSections();
124 [ + - ]: 742 : (void)args_manager.GetUnsuitableSectionOnlyArgs();
125 [ + - ]: 742 : (void)args_manager.IsArgNegated(s1);
126 [ + - ]: 742 : (void)args_manager.IsArgSet(s1);
127 : :
128 [ + - ]: 742 : (void)HelpRequested(args_manager);
129 : 742 : }
130 : : } // namespace
|