/ src / test / fuzz / script_ops.cpp
script_ops.cpp
 1  // Copyright (c) 2020-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 <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  
14  FUZZ_TARGET(script_ops)
15  {
16      FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
17      CScript script_mut = ConsumeScript(fuzzed_data_provider);
18      LIMITED_WHILE(fuzzed_data_provider.remaining_bytes() > 0, 1000000) {
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  }