Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10907470
system.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
system.cpp
View Options
// Copyright (c) 2020 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include
<util/system.h>
#include
<test/fuzz/FuzzedDataProvider.h>
#include
<test/fuzz/fuzz.h>
#include
<test/fuzz/util.h>
#include
<cstdint>
#include
<optional>
#include
<string>
#include
<vector>
namespace
{
std
::
string
GetArgumentName
(
const
std
::
string
&
name
)
{
size_t
idx
=
name
.
find
(
'='
);
if
(
idx
==
std
::
string
::
npos
)
{
idx
=
name
.
size
();
}
return
name
.
substr
(
0
,
idx
);
}
}
// namespace
void
test_one_input
(
const
std
::
vector
<
uint8_t
>
&
buffer
)
{
FuzzedDataProvider
fuzzed_data_provider
(
buffer
.
data
(),
buffer
.
size
());
ArgsManager
args_manager
{};
if
(
fuzzed_data_provider
.
ConsumeBool
())
{
SetupHelpOptions
(
args_manager
);
}
while
(
fuzzed_data_provider
.
ConsumeBool
())
{
switch
(
fuzzed_data_provider
.
ConsumeIntegralInRange
<
int
>
(
0
,
7
))
{
case
0
:
{
args_manager
.
SelectConfigNetwork
(
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
));
break
;
}
case
1
:
{
args_manager
.
SoftSetArg
(
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
),
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
));
break
;
}
case
2
:
{
args_manager
.
ForceSetArg
(
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
),
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
));
break
;
}
case
3
:
{
args_manager
.
SoftSetBoolArg
(
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
),
fuzzed_data_provider
.
ConsumeBool
());
break
;
}
case
4
:
{
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
});
// Avoid hitting:
// util/system.cpp:425: void ArgsManager::AddArg(const
// std::string &, const std::string &, unsigned int, const
// OptionsCategory &): Assertion `ret.second' failed.
const
std
::
string
argument_name
=
GetArgumentName
(
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
));
if
(
args_manager
.
GetArgFlags
(
argument_name
)
!=
std
::
nullopt
)
{
break
;
}
args_manager
.
AddArg
(
argument_name
,
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
),
fuzzed_data_provider
.
ConsumeIntegral
<
unsigned
int
>
(),
options_category
);
break
;
}
case
5
:
{
// Avoid hitting:
// util/system.cpp:425: void ArgsManager::AddArg(const
// std::string &, const std::string &, unsigned int, const
// OptionsCategory &): Assertion `ret.second' failed.
const
std
::
vector
<
std
::
string
>
names
=
ConsumeRandomLengthStringVector
(
fuzzed_data_provider
);
std
::
vector
<
std
::
string
>
hidden_arguments
;
for
(
const
std
::
string
&
name
:
names
)
{
const
std
::
string
hidden_argument
=
GetArgumentName
(
name
);
if
(
args_manager
.
GetArgFlags
(
hidden_argument
)
!=
std
::
nullopt
)
{
continue
;
}
if
(
std
::
find
(
hidden_arguments
.
begin
(),
hidden_arguments
.
end
(),
hidden_argument
)
!=
hidden_arguments
.
end
())
{
continue
;
}
hidden_arguments
.
push_back
(
hidden_argument
);
}
args_manager
.
AddHiddenArgs
(
hidden_arguments
);
break
;
}
case
6
:
{
args_manager
.
ClearArgs
();
break
;
}
case
7
:
{
const
std
::
vector
<
std
::
string
>
random_arguments
=
ConsumeRandomLengthStringVector
(
fuzzed_data_provider
);
std
::
vector
<
const
char
*>
argv
;
argv
.
reserve
(
random_arguments
.
size
());
for
(
const
std
::
string
&
random_argument
:
random_arguments
)
{
argv
.
push_back
(
random_argument
.
c_str
());
}
try
{
std
::
string
error
;
(
void
)
args_manager
.
ParseParameters
(
argv
.
size
(),
argv
.
data
(),
error
);
}
catch
(
const
std
::
logic_error
&
)
{
}
break
;
}
}
}
const
std
::
string
s1
=
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
);
const
std
::
string
s2
=
fuzzed_data_provider
.
ConsumeRandomLengthString
(
16
);
const
int64_t
i64
=
fuzzed_data_provider
.
ConsumeIntegral
<
int64_t
>
();
const
bool
b
=
fuzzed_data_provider
.
ConsumeBool
();
(
void
)
args_manager
.
GetIntArg
(
s1
,
i64
);
(
void
)
args_manager
.
GetArg
(
s1
,
s2
);
(
void
)
args_manager
.
GetArgFlags
(
s1
);
(
void
)
args_manager
.
GetArgs
(
s1
);
(
void
)
args_manager
.
GetBoolArg
(
s1
,
b
);
try
{
(
void
)
args_manager
.
GetChainName
();
}
catch
(
const
std
::
runtime_error
&
)
{
}
(
void
)
args_manager
.
GetHelpMessage
();
(
void
)
args_manager
.
GetUnrecognizedSections
();
(
void
)
args_manager
.
GetUnsuitableSectionOnlyArgs
();
(
void
)
args_manager
.
IsArgNegated
(
s1
);
(
void
)
args_manager
.
IsArgSet
(
s1
);
(
void
)
HelpRequested
(
args_manager
);
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Mon, Nov 25, 07:56 (1 d, 17 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4569353
Default Alt Text
system.cpp (6 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment