/root/bitcoin/src/test/fuzz/system.cpp
| Line | Count | Source | 
| 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 |