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