Branch data Line data Source code
1 : : // Copyright (c) 2009-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 <chainparams.h>
6 : : #include <rpc/client.h>
7 : : #include <rpc/util.h>
8 : : #include <test/fuzz/fuzz.h>
9 : : #include <util/chaintype.h>
10 : :
11 : : #include <limits>
12 : : #include <string>
13 : :
14 : 1 : void initialize_parse_univalue()
15 : : {
16 : 1 : SelectParams(ChainType::REGTEST);
17 : 1 : }
18 : :
19 [ + - ]: 2963 : FUZZ_TARGET(parse_univalue, .init = initialize_parse_univalue)
20 : : {
21 [ + - ]: 2551 : const std::string random_string(buffer.begin(), buffer.end());
22 : 2551 : bool valid = true;
23 : 5102 : const UniValue univalue = [&] {
24 [ + - ]: 2551 : UniValue uv;
25 [ + - + + ]: 2551 : if (!uv.read(random_string)) valid = false;
26 [ + + + - ]: 5102 : return valid ? uv : UniValue{};
27 [ + - ]: 5102 : }();
28 [ + + ]: 2551 : if (!valid) {
29 : 349 : return;
30 : : }
31 : 2202 : try {
32 [ + + ]: 2202 : (void)ParseHashO(univalue, "A");
33 [ - + + ]: 2199 : } catch (const UniValue&) {
34 : 2199 : } catch (const std::runtime_error&) {
35 : 2191 : }
36 : 2202 : try {
37 [ - + ]: 2202 : (void)ParseHashO(univalue, random_string);
38 [ - - + ]: 2202 : } catch (const UniValue&) {
39 : 2202 : } catch (const std::runtime_error&) {
40 : 2202 : }
41 : 2202 : try {
42 [ + + ]: 2202 : (void)ParseHashV(univalue, "A");
43 [ - + + ]: 2198 : } catch (const UniValue&) {
44 : 2198 : } catch (const std::runtime_error&) {
45 : 161 : }
46 : 2202 : try {
47 [ + + ]: 2202 : (void)ParseHashV(univalue, random_string);
48 [ - + + ]: 2198 : } catch (const UniValue&) {
49 : 2198 : } catch (const std::runtime_error&) {
50 : 161 : }
51 : 2202 : try {
52 [ + + ]: 2206 : (void)ParseHexO(univalue, "A");
53 [ - + ]: 2198 : } catch (const UniValue&) {
54 : 2198 : }
55 : 2202 : try {
56 [ - + ]: 2202 : (void)ParseHexO(univalue, random_string);
57 [ - + ]: 2202 : } catch (const UniValue&) {
58 : 2202 : }
59 : 2202 : try {
60 [ + + ]: 2209 : (void)ParseHexV(univalue, "A");
61 [ - + - ]: 2195 : } catch (const UniValue&) {
62 : 2195 : } catch (const std::runtime_error&) {
63 : 0 : }
64 : 2202 : try {
65 [ + + ]: 2209 : (void)ParseHexV(univalue, random_string);
66 [ - + - ]: 2195 : } catch (const UniValue&) {
67 : 2195 : } catch (const std::runtime_error&) {
68 : 0 : }
69 : 2202 : try {
70 [ + + + + : 2202 : if (univalue.isNull() || univalue.isStr()) (void)ParseSighashString(univalue);
+ + ]
71 [ - + ]: 2040 : } catch (const UniValue&) {
72 : 2040 : }
73 : 2202 : try {
74 [ + + ]: 2202 : (void)AmountFromValue(univalue);
75 [ - + - ]: 2187 : } catch (const UniValue&) {
76 : 2187 : } catch (const std::runtime_error&) {
77 : 0 : }
78 : 2202 : try {
79 : 2202 : FlatSigningProvider provider;
80 [ + + + + ]: 2202 : if (buffer.size() < 10'000) (void)EvalDescriptorStringOrObject(univalue, provider);
81 [ - + + ]: 3737 : } catch (const UniValue&) {
82 : 1535 : } catch (const std::runtime_error&) {
83 : 3 : }
84 : 2202 : try {
85 [ + + ]: 2202 : (void)ParseConfirmTarget(univalue, std::numeric_limits<unsigned int>::max());
86 [ - + + ]: 2197 : } catch (const UniValue&) {
87 : 2197 : } catch (const std::runtime_error&) {
88 : 2194 : }
89 : 2202 : try {
90 [ + + ]: 2202 : (void)ParseDescriptorRange(univalue);
91 [ - + + ]: 2197 : } catch (const UniValue&) {
92 : 2197 : } catch (const std::runtime_error&) {
93 : 53 : }
94 : 2551 : }
|