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