Coverage Report

Created: 2026-09-01 13:33

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
89.8k
{
24
89.8k
    size_t idx = name.find('=');
25
89.8k
    if (idx == std::string::npos) {
  Branch (25:9): [True: 82.4k, False: 7.40k]
26
82.4k
        idx = name.size();
27
82.4k
    }
28
89.8k
    return name.substr(0, idx);
29
89.8k
}
30
31
FUZZ_TARGET(system, .init = initialize_system)
32
710
{
33
710
    FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
34
710
    ArgsManager args_manager{};
35
710
    std::vector<std::string> command_option_names;
36
37
710
    if (fuzzed_data_provider.ConsumeBool()) {
  Branch (37:9): [True: 552, False: 158]
38
552
        SetupHelpOptions(args_manager);
39
552
    }
40
41
241k
    LIMITED_WHILE (fuzzed_data_provider.ConsumeBool(), 3000) {
42
241k
        CallOneOf(
43
241k
            fuzzed_data_provider,
44
241k
            [&] {
45
38.2k
                args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
46
38.2k
            },
47
241k
            [&] {
48
16.3k
                auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
49
16.3k
                auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
50
16.3k
                args_manager.SoftSetArg(str_arg, str_value);
51
16.3k
            },
52
241k
            [&] {
53
9.80k
                auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
54
9.80k
                auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
55
9.80k
                args_manager.ForceSetArg(str_arg, str_value);
56
9.80k
            },
57
241k
            [&] {
58
26.0k
                auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
59
26.0k
                auto f_value = fuzzed_data_provider.ConsumeBool();
60
26.0k
                args_manager.SoftSetBoolArg(str_arg, f_value);
61
26.0k
            },
62
241k
            [&] {
63
28.5k
                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});
64
                // Avoid hitting:
65
                // common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
66
28.5k
                const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
67
28.5k
                if (args_manager.GetArgFlags(argument_name) != std::nullopt) {
  Branch (67:21): [True: 12.3k, False: 16.1k]
68
12.3k
                    return;
69
12.3k
                }
70
16.1k
                auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
71
16.1k
                auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;
72
16.1k
                args_manager.AddArg(argument_name, help, flags, options_category);
73
16.1k
                if (options_category == OptionsCategory::COMMAND_OPTIONS) {
  Branch (73:21): [True: 7.05k, False: 9.13k]
74
7.05k
                    command_option_names.push_back(argument_name);
75
7.05k
                }
76
16.1k
            },
77
241k
            [&] {
78
30.2k
                auto cmd = fuzzed_data_provider.ConsumeRandomLengthString(16);
79
30.2k
                if (cmd.empty() || cmd[0] == '-' || cmd.find('=') != std::string::npos) return;
  Branch (79:21): [True: 4.62k, False: 25.6k]
  Branch (79:36): [True: 4.97k, False: 20.6k]
  Branch (79:53): [True: 633, False: 20.0k]
80
20.0k
                if (args_manager.GetArgFlags(cmd) != std::nullopt) return;
  Branch (80:21): [True: 4.27k, False: 15.7k]
81
15.7k
                auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
82
15.7k
                std::set<std::string> options;
83
33.3k
                for (const auto& opt : command_option_names) {
  Branch (83:38): [True: 33.3k, False: 15.7k]
84
33.3k
                    if (fuzzed_data_provider.ConsumeBool()) {
  Branch (84:25): [True: 32.6k, False: 731]
85
32.6k
                        options.insert(opt);
86
32.6k
                    }
87
33.3k
                }
88
15.7k
                args_manager.AddCommand(cmd, help, std::move(options));
89
15.7k
            },
90
241k
            [&] {
91
                // Avoid hitting:
92
                // common/args.cpp:563: void ArgsManager::AddArg(const std::string &, const std::string &, unsigned int, const OptionsCategory &): Assertion `ret.second' failed.
93
20.0k
                const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider);
94
20.0k
                std::vector<std::string> hidden_arguments;
95
61.3k
                for (const std::string& name : names) {
  Branch (95:46): [True: 61.3k, False: 20.0k]
96
61.3k
                    const std::string hidden_argument = GetArgumentName(name);
97
61.3k
                    if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) {
  Branch (97:25): [True: 33.3k, False: 28.0k]
98
33.3k
                        continue;
99
33.3k
                    }
100
28.0k
                    if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) {
  Branch (100:25): [True: 6.38k, False: 21.6k]
101
6.38k
                        continue;
102
6.38k
                    }
103
21.6k
                    hidden_arguments.push_back(hidden_argument);
104
21.6k
                }
105
20.0k
                args_manager.AddHiddenArgs(hidden_arguments);
106
20.0k
            },
107
241k
            [&] {
108
19.2k
                args_manager.ClearArgs();
109
19.2k
                command_option_names.clear();
110
19.2k
            },
111
241k
            [&] {
112
52.5k
                const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider);
113
52.5k
                std::vector<const char*> argv;
114
52.5k
                argv.reserve(random_arguments.size());
115
219k
                for (const std::string& random_argument : random_arguments) {
  Branch (115:57): [True: 219k, False: 52.5k]
116
219k
                    argv.push_back(random_argument.c_str());
117
219k
                }
118
52.5k
                try {
119
52.5k
                    std::string error;
120
52.5k
                    (void)args_manager.ParseParameters(argv.size(), argv.data(), error);
121
52.5k
                } catch (const std::logic_error&) {
122
0
                }
123
52.5k
            });
124
241k
    }
125
126
710
    const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16);
127
710
    const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16);
128
710
    const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>();
129
710
    const bool b = fuzzed_data_provider.ConsumeBool();
130
131
710
    (void)args_manager.GetIntArg(s1, i64);
132
710
    (void)args_manager.GetArg(s1, s2);
133
710
    (void)args_manager.GetArgFlags(s1);
134
710
    (void)args_manager.GetArgs(s1);
135
710
    (void)args_manager.GetBoolArg(s1, b);
136
710
    try {
137
710
        (void)args_manager.GetChainTypeString();
138
710
    } catch (const std::runtime_error&) {
139
7
    }
140
710
    (void)args_manager.GetHelpMessage();
141
710
    const auto command = args_manager.GetCommand();
142
710
    if (command) {
  Branch (142:9): [True: 254, False: 456]
143
254
        (void)args_manager.CheckCommandOptions(command->command);
144
254
    }
145
710
    (void)args_manager.GetUnrecognizedSections();
146
710
    (void)args_manager.GetUnsuitableSectionOnlyArgs();
147
710
    (void)args_manager.IsArgNegated(s1);
148
710
    (void)args_manager.IsArgSet(s1);
149
150
710
    (void)HelpRequested(args_manager);
151
710
}
152
} // namespace