Branch data 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 : 1 : void initialize_system() 17 : : { 18 [ + - - + : 1 : static const auto testing_setup = MakeNoLogFileContext<>(); + - ] 19 : 1 : } 20 : : 21 : 67707 : std::string GetArgumentName(const std::string& name) 22 : : { 23 : 67707 : size_t idx = name.find('='); 24 [ + + ]: 67707 : if (idx == std::string::npos) { 25 : 63748 : idx = name.size(); 26 : 63748 : } 27 : 67707 : return name.substr(0, idx); 28 : : } 29 : : 30 [ + - - + ]: 662 : FUZZ_TARGET(system, .init = initialize_system) 31 : : { 32 : 316 : FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 33 : 316 : ArgsManager args_manager{}; 34 : : 35 [ + - + + ]: 316 : if (fuzzed_data_provider.ConsumeBool()) { 36 [ + - ]: 264 : SetupHelpOptions(args_manager); 37 : 264 : } 38 : : 39 [ + - + + : 60130 : LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 3000) + + ] 40 : : { 41 [ + - ]: 59814 : CallOneOf( 42 : : fuzzed_data_provider, 43 : 60799 : [&] { 44 [ + - ]: 985 : args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16)); 45 : 985 : }, 46 : 63987 : [&] { 47 [ + - - + ]: 4173 : args_manager.SoftSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16)); 48 : 4173 : }, 49 : 60826 : [&] { 50 [ + - - + ]: 1012 : args_manager.ForceSetArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeRandomLengthString(16)); 51 : 1012 : }, 52 : 72551 : [&] { 53 [ + - + - ]: 12737 : args_manager.SoftSetBoolArg(fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeBool()); 54 : 12737 : }, 55 : 67865 : [&] { 56 : 8051 : 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 [ + - ]: 8051 : const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16)); 60 [ + - + + ]: 8051 : if (args_manager.GetArgFlags(argument_name) != std::nullopt) { 61 : 372 : return; 62 : : } 63 [ + - + - : 7679 : args_manager.AddArg(argument_name, fuzzed_data_provider.ConsumeRandomLengthString(16), fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND, options_category); + - ] 64 [ - + ]: 8051 : }, 65 : 67316 : [&] { 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 : 7502 : const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider); 69 : 7502 : std::vector<std::string> hidden_arguments; 70 [ + + ]: 67158 : for (const std::string& name : names) { 71 [ + - ]: 59656 : const std::string hidden_argument = GetArgumentName(name); 72 [ + - + + ]: 59656 : if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) { 73 : 10921 : continue; 74 : 173 : } 75 [ + - + + ]: 48735 : if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) { 76 : 3023 : continue; 77 : : } 78 [ + - ]: 45712 : hidden_arguments.push_back(hidden_argument); 79 [ - + + ]: 59656 : } 80 [ + - ]: 7502 : args_manager.AddHiddenArgs(hidden_arguments); 81 : 7502 : }, 82 : 63587 : [&] { 83 : 3773 : args_manager.ClearArgs(); 84 : 3773 : }, 85 : 81395 : [&] { 86 : 21581 : const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider); 87 : 21581 : std::vector<const char*> argv; 88 [ + - ]: 21581 : argv.reserve(random_arguments.size()); 89 [ + + ]: 97867 : for (const std::string& random_argument : random_arguments) { 90 [ + - ]: 76286 : argv.push_back(random_argument.c_str()); 91 : : } 92 : : try { 93 : 21581 : std::string error; 94 [ + - ]: 21581 : (void)args_manager.ParseParameters(argv.size(), argv.data(), error); 95 [ # # ]: 21581 : } catch (const std::logic_error&) { 96 [ # # ]: 0 : } 97 : 21581 : }); 98 : 59814 : } 99 : : 100 [ + - ]: 316 : const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16); 101 [ + - ]: 316 : const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16); 102 [ + - ]: 316 : const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>(); 103 [ + - ]: 316 : const bool b = fuzzed_data_provider.ConsumeBool(); 104 : : 105 [ + - ]: 316 : (void)args_manager.GetIntArg(s1, i64); 106 [ + - ]: 316 : (void)args_manager.GetArg(s1, s2); 107 [ + - ]: 316 : (void)args_manager.GetArgFlags(s1); 108 [ + - ]: 316 : (void)args_manager.GetArgs(s1); 109 [ + - ]: 316 : (void)args_manager.GetBoolArg(s1, b); 110 : : try { 111 [ + + ]: 316 : (void)args_manager.GetChainTypeString(); 112 [ + - ]: 316 : } catch (const std::runtime_error&) { 113 [ + - ]: 3 : } 114 [ + - ]: 316 : (void)args_manager.GetHelpMessage(); 115 [ + - ]: 316 : (void)args_manager.GetUnrecognizedSections(); 116 [ + - ]: 316 : (void)args_manager.GetUnsuitableSectionOnlyArgs(); 117 [ + - ]: 316 : (void)args_manager.IsArgNegated(s1); 118 [ + - ]: 316 : (void)args_manager.IsArgSet(s1); 119 : : 120 [ + - ]: 316 : (void)HelpRequested(args_manager); 121 : 319 : } 122 : : } // namespace