Coverage Report

Created: 2025-04-09 20:00

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