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 0 : void initialize_system() 17 : { 18 0 : static const auto testing_setup = MakeNoLogFileContext<>(); 19 0 : } 20 : 21 0 : std::string GetArgumentName(const std::string& name) 22 : { 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 : } 29 : 30 4 : FUZZ_TARGET(system, .init = initialize_system) 31 : { 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 : { 41 0 : CallOneOf( 42 : fuzzed_data_provider, 43 0 : [&] { 44 0 : args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16)); 45 0 : }, 46 0 : [&] { 47 0 : args_manager.SoftSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16)); 48 0 : }, 49 0 : [&] { 50 0 : args_manager.ForceSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16)); 51 0 : }, 52 0 : [&] { 53 0 : args_manager.SoftSetBoolArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeBool()); 54 0 : }, 55 0 : [&] { 56 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::HIDDEN}); 57 : // Avoid hitting: 58 : // common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed. 59 0 : const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16)); 60 0 : if (args_manager.GetArgFlags(argument_name) != std::nullopt) { 61 0 : return; 62 : } 63 0 : args_manager.AddArg(argument_name, fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND, options_category); 64 0 : }, 65 0 : [&] { 66 : // Avoid hitting: 67 : // common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed. 68 0 : const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider); 69 0 : std::vector<std::string> hidden_arguments; 70 0 : for (const std::string& name : names) { 71 0 : const std::string hidden_argument = GetArgumentName(name); 72 0 : if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) { 73 0 : continue; 74 2 : } 75 0 : if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) { 76 0 : continue; 77 : } 78 0 : hidden_arguments.push_back(hidden_argument); 79 0 : } 80 0 : args_manager.AddHiddenArgs(hidden_arguments); 81 0 : }, 82 0 : [&] { 83 0 : args_manager.ClearArgs(); 84 0 : }, 85 0 : [&] { 86 0 : const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider); 87 0 : std::vector<const char*> argv; 88 0 : argv.reserve(random_arguments.size()); 89 0 : for (const std::string& random_argument : random_arguments) { 90 0 : argv.push_back(random_argument.c_str()); 91 : } 92 : try { 93 0 : std::string error; 94 0 : (void)args_manager.ParseParameters(argv.size(), argv.data(), error); 95 0 : } catch (const std::logic_error&) { 96 0 : } 97 0 : }); 98 0 : } 99 : 100 0 : const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16); 101 0 : const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16); 102 0 : const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>(); 103 0 : const bool b = fuzzed_data_provider.ConsumeBool(); 104 : 105 0 : (void)args_manager.GetIntArg(s1, i64); 106 0 : (void)args_manager.GetArg(s1, s2); 107 0 : (void)args_manager.GetArgFlags(s1); 108 0 : (void)args_manager.GetArgs(s1); 109 0 : (void)args_manager.GetBoolArg(s1, b); 110 : try { 111 0 : (void)args_manager.GetChainTypeString(); 112 0 : } catch (const std::runtime_error&) { 113 0 : } 114 0 : (void)args_manager.GetHelpMessage(); 115 0 : (void)args_manager.GetUnrecognizedSections(); 116 0 : (void)args_manager.GetUnsuitableSectionOnlyArgs(); 117 0 : (void)args_manager.IsArgNegated(s1); 118 0 : (void)args_manager.IsArgSet(s1); 119 : 120 0 : (void)HelpRequested(args_manager); 121 0 : } 122 : } // namespace