/root/bitcoin/src/test/fuzz/system.cpp
Line | Count | Source (jump to first uncovered line) |
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 | | void initialize_system() |
17 | 0 | { |
18 | 0 | static const auto testing_setup = MakeNoLogFileContext<>(); |
19 | 0 | } |
20 | | |
21 | | std::string GetArgumentName(const std::string& name) |
22 | 0 | { |
23 | 0 | size_t idx = name.find('='); |
24 | 0 | if (idx == std::string::npos) { |
25 | 0 | idx = name.size(); |
26 | 0 | } |
27 | 0 | return name.substr(0, idx); |
28 | 0 | } |
29 | | |
30 | | FUZZ_TARGET(system, .init = initialize_system) |
31 | 0 | { |
32 | 0 | FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); |
33 | 0 | ArgsManager args_manager{}; |
34 | |
|
35 | 0 | if (fuzzed_data_provider.ConsumeBool()) { |
36 | 0 | SetupHelpOptions(args_manager); |
37 | 0 | } |
38 | |
|
39 | 0 | LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 3000) |
40 | 0 | { |
41 | 0 | CallOneOf( |
42 | 0 | fuzzed_data_provider, |
43 | 0 | [&] { |
44 | 0 | args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16)); |
45 | 0 | }, |
46 | 0 | [&] { |
47 | 0 | auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16); |
48 | 0 | auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16); |
49 | 0 | args_manager.SoftSetArg(str_arg, str_value); |
50 | 0 | }, |
51 | 0 | [&] { |
52 | 0 | auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16); |
53 | 0 | auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16); |
54 | 0 | args_manager.ForceSetArg(str_arg, str_value); |
55 | 0 | }, |
56 | 0 | [&] { |
57 | 0 | auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16); |
58 | 0 | auto f_value = fuzzed_data_provider.ConsumeBool(); |
59 | 0 | args_manager.SoftSetBoolArg(str_arg, f_value); |
60 | 0 | }, |
61 | 0 | [&] { |
62 | 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::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 | 0 | const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16)); |
66 | 0 | if (args_manager.GetArgFlags(argument_name) != std::nullopt) { |
67 | 0 | return; |
68 | 0 | } |
69 | 0 | auto help = fuzzed_data_provider.ConsumeRandomLengthString(16); |
70 | 0 | auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND; |
71 | 0 | args_manager.AddArg(argument_name, help, flags, options_category); |
72 | 0 | }, |
73 | 0 | [&] { |
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 | 0 | const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider); |
77 | 0 | std::vector<std::string> hidden_arguments; |
78 | 0 | for (const std::string& name : names) { |
79 | 0 | const std::string hidden_argument = GetArgumentName(name); |
80 | 0 | if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) { |
81 | 0 | continue; |
82 | 0 | } |
83 | 0 | if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) { |
84 | 0 | continue; |
85 | 0 | } |
86 | 0 | hidden_arguments.push_back(hidden_argument); |
87 | 0 | } |
88 | 0 | args_manager.AddHiddenArgs(hidden_arguments); |
89 | 0 | }, |
90 | 0 | [&] { |
91 | 0 | args_manager.ClearArgs(); |
92 | 0 | }, |
93 | 0 | [&] { |
94 | 0 | const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider); |
95 | 0 | std::vector<const char*> argv; |
96 | 0 | argv.reserve(random_arguments.size()); |
97 | 0 | for (const std::string& random_argument : random_arguments) { |
98 | 0 | argv.push_back(random_argument.c_str()); |
99 | 0 | } |
100 | 0 | try { |
101 | 0 | std::string error; |
102 | 0 | (void)args_manager.ParseParameters(argv.size(), argv.data(), error); |
103 | 0 | } catch (const std::logic_error&) { |
104 | 0 | } |
105 | 0 | }); |
106 | 0 | } |
107 | |
|
108 | 0 | const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16); |
109 | 0 | const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16); |
110 | 0 | const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>(); |
111 | 0 | const bool b = fuzzed_data_provider.ConsumeBool(); |
112 | |
|
113 | 0 | (void)args_manager.GetIntArg(s1, i64); |
114 | 0 | (void)args_manager.GetArg(s1, s2); |
115 | 0 | (void)args_manager.GetArgFlags(s1); |
116 | 0 | (void)args_manager.GetArgs(s1); |
117 | 0 | (void)args_manager.GetBoolArg(s1, b); |
118 | 0 | try { |
119 | 0 | (void)args_manager.GetChainTypeString(); |
120 | 0 | } catch (const std::runtime_error&) { |
121 | 0 | } |
122 | 0 | (void)args_manager.GetHelpMessage(); |
123 | 0 | (void)args_manager.GetUnrecognizedSections(); |
124 | 0 | (void)args_manager.GetUnsuitableSectionOnlyArgs(); |
125 | 0 | (void)args_manager.IsArgNegated(s1); |
126 | 0 | (void)args_manager.IsArgSet(s1); |
127 | |
|
128 | 0 | (void)HelpRequested(args_manager); |
129 | 0 | } |
130 | | } // namespace |