Coverage Report

Created: 2026-06-09 19:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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