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 <script/script.h>
6 #include <test/fuzz/FuzzedDataProvider.h>
7 #include <test/fuzz/fuzz.h>
8 #include <test/fuzz/util.h>
9 
10 #include <cstdint>
11 #include <string>
12 #include <vector>
13 
FUZZ_TARGET(script_ops)14 FUZZ_TARGET(script_ops)
15 {
16     FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
17     CScript script_mut = ConsumeScript(fuzzed_data_provider);
18     while (fuzzed_data_provider.remaining_bytes() > 0) {
19         CallOneOf(
20             fuzzed_data_provider,
21             [&] {
22                 CScript s = ConsumeScript(fuzzed_data_provider);
23                 script_mut = std::move(s);
24             },
25             [&] {
26                 const CScript& s = ConsumeScript(fuzzed_data_provider);
27                 script_mut = s;
28             },
29             [&] {
30                 script_mut << fuzzed_data_provider.ConsumeIntegral<int64_t>();
31             },
32             [&] {
33                 script_mut << ConsumeOpcodeType(fuzzed_data_provider);
34             },
35             [&] {
36                 script_mut << ConsumeScriptNum(fuzzed_data_provider);
37             },
38             [&] {
39                 script_mut << ConsumeRandomLengthByteVector(fuzzed_data_provider);
40             },
41             [&] {
42                 script_mut.clear();
43             });
44     }
45     const CScript& script = script_mut;
46     (void)script.GetSigOpCount(false);
47     (void)script.GetSigOpCount(true);
48     (void)script.GetSigOpCount(script);
49     (void)script.HasValidOps();
50     (void)script.IsPayToScriptHash();
51     (void)script.IsPayToWitnessScriptHash();
52     (void)script.IsPushOnly();
53     (void)script.IsUnspendable();
54     {
55         CScript::const_iterator pc = script.begin();
56         opcodetype opcode;
57         (void)script.GetOp(pc, opcode);
58         std::vector<uint8_t> data;
59         (void)script.GetOp(pc, opcode, data);
60         (void)script.IsPushOnly(pc);
61     }
62     {
63         int version;
64         std::vector<uint8_t> program;
65         (void)script.IsWitnessProgram(version, program);
66     }
67 }
68