Coverage Report

Created: 2026-10-07 20:26

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
        CallOneOf(
43
0
            fuzzed_data_provider,
44
0
            [&] {
45
0
                args_manager.SelectConfigNetwork(fuzzed_data_provider.ConsumeRandomLengthString(16));
46
0
            },
47
0
            [&] {
48
0
                auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
49
0
                auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
50
0
                args_manager.SoftSetArg(str_arg, str_value);
51
0
            },
52
0
            [&] {
53
0
                auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
54
0
                auto str_value = fuzzed_data_provider.ConsumeRandomLengthString(16);
55
0
                args_manager.ForceSetArg(str_arg, str_value);
56
0
            },
57
0
            [&] {
58
0
                auto str_arg = fuzzed_data_provider.ConsumeRandomLengthString(16);
59
0
                auto f_value = fuzzed_data_provider.ConsumeBool();
60
0
                args_manager.SoftSetBoolArg(str_arg, f_value);
61
0
            },
62
0
            [&] {
63
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});
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
0
                const std::string argument_name = GetArgumentName(fuzzed_data_provider.ConsumeRandomLengthString(16));
67
0
                if (args_manager.GetArgFlags(argument_name) != std::nullopt) {
  Branch (67:21): [True: 0, False: 0]
68
0
                    return;
69
0
                }
70
0
                auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
71
0
                auto flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>() & ~ArgsManager::COMMAND;
72
0
                args_manager.AddArg(argument_name, help, flags, options_category);
73
0
                if (options_category == OptionsCategory::COMMAND_OPTIONS) {
  Branch (73:21): [True: 0, False: 0]
74
0
                    command_option_names.push_back(argument_name);
75
0
                }
76
0
            },
77
0
            [&] {
78
0
                auto cmd = fuzzed_data_provider.ConsumeRandomLengthString(16);
79
0
                if (cmd.empty() || cmd[0] == '-' || cmd.find('=') != std::string::npos) return;
  Branch (79:21): [True: 0, False: 0]
  Branch (79:36): [True: 0, False: 0]
  Branch (79:53): [True: 0, False: 0]
80
0
                if (args_manager.GetArgFlags(cmd) != std::nullopt) return;
  Branch (80:21): [True: 0, False: 0]
81
0
                auto help = fuzzed_data_provider.ConsumeRandomLengthString(16);
82
0
                std::set<std::string> options;
83
0
                for (const auto& opt : command_option_names) {
  Branch (83:38): [True: 0, False: 0]
84
0
                    if (fuzzed_data_provider.ConsumeBool()) {
  Branch (84:25): [True: 0, False: 0]
85
0
                        options.insert(opt);
86
0
                    }
87
0
                }
88
0
                args_manager.AddCommand(cmd, help, std::move(options));
89
0
            },
90
0
            [&] {
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
0
                const std::vector<std::string> names = ConsumeRandomLengthStringVector(fuzzed_data_provider);
94
0
                std::vector<std::string> hidden_arguments;
95
0
                for (const std::string& name : names) {
  Branch (95:46): [True: 0, False: 0]
96
0
                    const std::string hidden_argument = GetArgumentName(name);
97
0
                    if (args_manager.GetArgFlags(hidden_argument) != std::nullopt) {
  Branch (97:25): [True: 0, False: 0]
98
0
                        continue;
99
0
                    }
100
0
                    if (std::find(hidden_arguments.begin(), hidden_arguments.end(), hidden_argument) != hidden_arguments.end()) {
  Branch (100:25): [True: 0, False: 0]
101
0
                        continue;
102
0
                    }
103
0
                    hidden_arguments.push_back(hidden_argument);
104
0
                }
105
0
                args_manager.AddHiddenArgs(hidden_arguments);
106
0
            },
107
0
            [&] {
108
0
                args_manager.ClearArgs();
109
0
                command_option_names.clear();
110
0
            },
111
0
            [&] {
112
0
                const std::vector<std::string> random_arguments = ConsumeRandomLengthStringVector(fuzzed_data_provider);
113
0
                std::vector<const char*> argv;
114
0
                argv.reserve(random_arguments.size());
115
0
                for (const std::string& random_argument : random_arguments) {
  Branch (115:57): [True: 0, False: 0]
116
0
                    argv.push_back(random_argument.c_str());
117
0
                }
118
0
                try {
119
0
                    std::string error;
120
0
                    (void)args_manager.ParseParameters(argv.size(), argv.data(), error);
121
0
                } catch (const std::logic_error&) {
122
0
                }
123
0
            });
124
0
    }
125
126
0
    const std::string s1 = fuzzed_data_provider.ConsumeRandomLengthString(16);
127
0
    const std::string s2 = fuzzed_data_provider.ConsumeRandomLengthString(16);
128
0
    const int64_t i64 = fuzzed_data_provider.ConsumeIntegral<int64_t>();
129
0
    const bool b = fuzzed_data_provider.ConsumeBool();
130
131
0
    (void)args_manager.GetIntArg(s1, i64);
132
0
    (void)args_manager.GetArg(s1, s2);
133
0
    (void)args_manager.GetArgFlags(s1);
134
0
    (void)args_manager.GetArgs(s1);
135
0
    (void)args_manager.GetBoolArg(s1, b);
136
0
    try {
137
0
        (void)args_manager.GetChainTypeString();
138
0
    } catch (const std::runtime_error&) {
139
0
    }
140
0
    (void)args_manager.GetHelpMessage();
141
0
    const auto command = args_manager.GetCommand();
142
0
    if (command) {
  Branch (142:9): [True: 0, False: 0]
143
0
        (void)args_manager.CheckCommandOptions(command->command);
144
0
    }
145
0
    (void)args_manager.GetUnrecognizedSections();
146
0
    (void)args_manager.GetUnsuitableSectionOnlyArgs();
147
0
    (void)args_manager.IsArgNegated(s1);
148
0
    (void)args_manager.IsArgSet(s1);
149
150
0
    (void)HelpRequested(args_manager);
151
0
}
152
} // namespace