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 [ + - ]: 3044 : FUZZ_TARGET(parse_univalue, .init = initialize_parse_univalue)
20 : : {
21 [ + - ]: 2630 : const std::string random_string(buffer.begin(), buffer.end());
22 : 2630 : bool valid = true;
23 : 5260 : const UniValue univalue = [&] {
24 [ + - ]: 2630 : UniValue uv;
25 [ + - + + ]: 2630 : if (!uv.read(random_string)) valid = false;
26 [ + + + - ]: 5260 : return valid ? uv : UniValue{};
27 [ + - ]: 5260 : }();
28 [ + + ]: 2630 : if (!valid) {
29 : 360 : return;
30 : : }
31 : 2270 : try {
32 [ + + ]: 2270 : (void)ParseHashO(univalue, "A");
33 [ - + + ]: 2267 : } catch (const UniValue&) {
34 : 2267 : } catch (const std::runtime_error&) {
35 : 2258 : }
36 : 2270 : try {
37 [ - + ]: 2270 : (void)ParseHashO(univalue, random_string);
38 [ - - + ]: 2270 : } catch (const UniValue&) {
39 : 2270 : } catch (const std::runtime_error&) {
40 : 2270 : }
41 : 2270 : try {
42 [ + + ]: 2270 : (void)ParseHashV(univalue, "A");
43 [ - + + ]: 2266 : } catch (const UniValue&) {
44 : 2266 : } catch (const std::runtime_error&) {
45 : 166 : }
46 : 2270 : try {
47 [ + + ]: 2270 : (void)ParseHashV(univalue, random_string);
48 [ - + + ]: 2266 : } catch (const UniValue&) {
49 : 2266 : } catch (const std::runtime_error&) {
50 : 166 : }
51 : 2270 : try {
52 [ + + ]: 2274 : (void)ParseHexO(univalue, "A");
53 [ - + ]: 2266 : } catch (const UniValue&) {
54 : 2266 : }
55 : 2270 : try {
56 [ - + ]: 2270 : (void)ParseHexO(univalue, random_string);
57 [ - + ]: 2270 : } catch (const UniValue&) {
58 : 2270 : }
59 : 2270 : try {
60 [ + + ]: 2277 : (void)ParseHexV(univalue, "A");
61 [ - + - ]: 2263 : } catch (const UniValue&) {
62 : 2263 : } catch (const std::runtime_error&) {
63 : 0 : }
64 : 2270 : try {
65 [ + + ]: 2277 : (void)ParseHexV(univalue, random_string);
66 [ - + - ]: 2263 : } catch (const UniValue&) {
67 : 2263 : } catch (const std::runtime_error&) {
68 : 0 : }
69 : 2270 : try {
70 [ + + + + : 2270 : if (univalue.isNull() || univalue.isStr()) (void)ParseSighashString(univalue);
+ + ]
71 [ - + ]: 2103 : } catch (const UniValue&) {
72 : 2103 : }
73 : 2270 : try {
74 [ + + ]: 2270 : (void)AmountFromValue(univalue);
75 [ - + - ]: 2255 : } catch (const UniValue&) {
76 : 2255 : } catch (const std::runtime_error&) {
77 : 0 : }
78 : 2270 : try {
79 : 2270 : FlatSigningProvider provider;
80 [ + + + + ]: 2270 : if (buffer.size() < 10'000) (void)EvalDescriptorStringOrObject(univalue, provider);
81 [ - + + ]: 3859 : } catch (const UniValue&) {
82 : 1589 : } catch (const std::runtime_error&) {
83 : 3 : }
84 : 2270 : try {
85 [ + + ]: 2270 : (void)ParseConfirmTarget(univalue, std::numeric_limits<unsigned int>::max());
86 [ - + + ]: 2265 : } catch (const UniValue&) {
87 : 2265 : } catch (const std::runtime_error&) {
88 : 2261 : }
89 : 2270 : try {
90 [ + + ]: 2270 : (void)ParseDescriptorRange(univalue);
91 [ - + + ]: 2265 : } catch (const UniValue&) {
92 : 2265 : } catch (const std::runtime_error&) {
93 : 53 : }
94 : 2630 : }
|