/root/bitcoin/src/test/fuzz/system.cpp
Line | Count | Source |
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> |
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 <set> |
13 | | #include <string> |
14 | | #include <vector> |
15 | | |
16 | | namespace { |
17 | | void initialize_system() |
18 | 0 | { |
19 | 0 | static const auto testing_setup = MakeNoLogFileContext<>(); |
20 | 0 | } |
21 | | |
22 | | std::string GetArgumentName(const std::string& name) |
23 | 89.8k | { |
24 | 89.8k | size_t idx = name.find('='); |
25 | 89.8k | if (idx == std::string::npos) { Branch (25:9): [True: 82.4k, False: 7.40k]
|
26 | 82.4k | idx = name.size(); |
27 | 82.4k | } |
28 | 89.8k | return name.substr(0, idx); |
29 | 89.8k | } |
30 | | |
31 | | FUZZ_TARGET(system, .init = initialize_system) |
32 | 710 | { |
33 | 710 | FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); |
34 | 710 | ArgsManager args_manager{}; |
35 | 710 | std::vector<std::string> command_option_names; |
36 | | |
37 | 710 | if (fuzzed_data_provider.ConsumeBool()) { Branch (37:9): [True: 552, False: 158]
|
38 | 552 | SetupHelpOptions(args_manager); |
39 | 552 | } |
40 | | |
41 | 241k | LIMITED_WHILE (fuzzed_data_provider.ConsumeBool(), 3000) { |
42 | 241k | CallOneOf( |
43 | 241k | fuzzed_data_provider, |
44 | 241k | [&] { |
45 | 38.2k | args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16)); |
46 | 38.2k | }, |
47 | 241k | [&] { |
48 | 16.3k | auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16); |
49 | 16.3k | auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16); |
50 | 16.3k | args_manager.SoftSetArg(str_arg, str_value); |
51 | 16.3k | }, |
52 | 241k | [&] { |
53 | 9.80k | auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16); |
54 | 9.80k | auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16); |
55 | 9.80k | args_manager.ForceSetArg(str_arg, str_value); |
56 | 9.80k | }, |
57 | 241k | [&] { |
58 | 26.0k | auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16); |
59 | 26.0k | auto f_value = fuzzed_data_provider.ConsumeBool(); |
60 | 26.0k | args_manager.SoftSetBoolArg(str_arg, f_value); |
61 | 26.0k | }, |
62 | 241k | [&] { |
63 | 28.5k | 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::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. |
66 | 28.5k | const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16)); |
67 | 28.5k | if (args_manager.GetArgFlags(argument_name) != std::nullopt) { Branch (67:21): [True: 12.3k, False: 16.1k]
|
68 | 12.3k | return; |
69 | 12.3k | } |
70 | 16.1k | auto help = fuzzed_data_provider.ConsumeRandomLengthString(16); |
71 | 16.1k | auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND; |
72 | 16.1k | args_manager.AddArg(argument_name, help, flags, options_category); |
73 | 16.1k | if (options_category == OptionsCategory::COMMAND_OPTIONS) { Branch (73:21): [True: 7.05k, False: 9.13k]
|
74 | 7.05k | command_option_names.push_back(argument_name); |
75 | 7.05k | } |
76 | 16.1k | }, |
77 | 241k | [&] { |
78 | 30.2k | auto cmd = fuzzed_data_provider.ConsumeRandomLengthString(16); |
79 | 30.2k | if (cmd.empty() || cmd[0] == '-' || cmd.find('=') != std::string::npos) return; Branch (79:21): [True: 4.62k, False: 25.6k]
Branch (79:36): [True: 4.97k, False: 20.6k]
Branch (79:53): [True: 633, False: 20.0k]
|
80 | 20.0k | if (args_manager.GetArgFlags(cmd) != std::nullopt) return; Branch (80:21): [True: 4.27k, False: 15.7k]
|
81 | 15.7k | auto help = fuzzed_data_provider.ConsumeRandomLengthString(16); |
82 | 15.7k | std::set<std::string> options; |
83 | 33.3k | for (const auto& opt : command_option_names) { Branch (83:38): [True: 33.3k, False: 15.7k]
|
84 | 33.3k | if (fuzzed_data_provider.ConsumeBool()) { Branch (84:25): [True: 32.6k, False: 731]
|
85 | 32.6k | options.insert(opt); |
86 | 32.6k | } |
87 | 33.3k | } |
88 | 15.7k | args_manager.AddCommand(cmd, help, std::move(options)); |
89 | 15.7k | }, |
90 | 241k | [&] { |
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 | 20.0k | const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider); |
94 | 20.0k | std::vector<std::string> hidden_arguments; |
95 | 61.3k | for (const std::string& name : names) { Branch (95:46): [True: 61.3k, False: 20.0k]
|
96 | 61.3k | const std::string hidden_argument = GetArgumentName(name); |
97 | 61.3k | if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) { Branch (97:25): [True: 33.3k, False: 28.0k]
|
98 | 33.3k | continue; |
99 | 33.3k | } |
100 | 28.0k | if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) { Branch (100:25): [True: 6.38k, False: 21.6k]
|
101 | 6.38k | continue; |
102 | 6.38k | } |
103 | 21.6k | hidden_arguments.push_back(hidden_argument); |
104 | 21.6k | } |
105 | 20.0k | args_manager.AddHiddenArgs(hidden_arguments); |
106 | 20.0k | }, |
107 | 241k | [&] { |
108 | 19.2k | args_manager.ClearArgs(); |
109 | 19.2k | command_option_names.clear(); |
110 | 19.2k | }, |
111 | 241k | [&] { |
112 | 52.5k | const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider); |
113 | 52.5k | std::vector<const char*> argv; |
114 | 52.5k | argv.reserve(random_arguments.size()); |
115 | 219k | for (const std::string& random_argument : random_arguments) { Branch (115:57): [True: 219k, False: 52.5k]
|
116 | 219k | argv.push_back(random_argument.c_str()); |
117 | 219k | } |
118 | 52.5k | try { |
119 | 52.5k | std::string error; |
120 | 52.5k | (void)args_manager.ParseParameters(argv.size(), argv.data(), error); |
121 | 52.5k | } catch (const std::logic_error&) { |
122 | 0 | } |
123 | 52.5k | }); |
124 | 241k | } |
125 | | |
126 | 710 | const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16); |
127 | 710 | const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16); |
128 | 710 | const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>(); |
129 | 710 | const bool b = fuzzed_data_provider.ConsumeBool(); |
130 | | |
131 | 710 | (void)args_manager.GetIntArg(s1, i64); |
132 | 710 | (void)args_manager.GetArg(s1, s2); |
133 | 710 | (void)args_manager.GetArgFlags(s1); |
134 | 710 | (void)args_manager.GetArgs(s1); |
135 | 710 | (void)args_manager.GetBoolArg(s1, b); |
136 | 710 | try { |
137 | 710 | (void)args_manager.GetChainTypeString(); |
138 | 710 | } catch (const std::runtime_error&) { |
139 | 7 | } |
140 | 710 | (void)args_manager.GetHelpMessage(); |
141 | 710 | const auto command = args_manager.GetCommand(); |
142 | 710 | if (command) { Branch (142:9): [True: 254, False: 456]
|
143 | 254 | (void)args_manager.CheckCommandOptions(command->command); |
144 | 254 | } |
145 | 710 | (void)args_manager.GetUnrecognizedSections(); |
146 | 710 | (void)args_manager.GetUnsuitableSectionOnlyArgs(); |
147 | 710 | (void)args_manager.IsArgNegated(s1); |
148 | 710 | (void)args_manager.IsArgSet(s1); |
149 | | |
150 | 710 | (void)HelpRequested(args_manager); |
151 | 710 | } |
152 | | } // namespace |