Adds unit tests for boundary checks and live mutants in src/script/script.cpp.
<details> <summary><a href="https://mutanthub.space/mutants/533">script.cpp:173</a>: <code>lastOpcode >= OP_1</code> -> <code>> OP_1</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -173,1 +173,1 @@ unsigned int CScript::GetSigOpCount(bool fAccurate) const
- if (fAccurate && lastOpcode >= OP_1 && lastOpcode <= OP_16)
+ if (fAccurate && lastOpcode > OP_1 && lastOpcode <= OP_16)
Fails BOOST_CHECK_EQUAL(s_1of1.GetSigOpCount(true), 1U) in sigopcount_tests.cpp.
</details>
<details> <summary><a href="https://mutanthub.space/mutants/534">script.cpp:186</a>: <code>GetSigOpCount(true)</code> -> <code>GetSigOpCount(false)</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -186,1 +186,1 @@ unsigned int CScript::GetSigOpCount(const CScript& scriptSig) const
- return GetSigOpCount(true);
+ return GetSigOpCount(false);
Fails BOOST_CHECK_EQUAL(s1.GetSigOpCount(scriptSig), 3U) in sigopcount_tests.cpp.
</details>
<details> <summary><a href="https://mutanthub.space/mutants/536">script.cpp:198</a>: <code>opcode > OP_16</code> -> <code>>= OP_16</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -198,1 +198,1 @@ unsigned int CScript::GetSigOpCount(const CScript& scriptSig) const
- if (opcode > OP_16)
+ if (opcode >= OP_16)
Fails BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(script_sig_op16), 3U) in sigopcount_tests.cpp.
</details>
<details> <summary><a href="https://mutanthub.space/mutants/545">script.cpp:220</a>: <code>program[0] == 0x4e &&</code> -> <code>||</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -220,1 +220,1 @@ bool CScript::IsPayToAnchor(int version, const std::vector<unsigned char>& progr
- program[0] == 0x4e &&
+ program[0] == 0x4e ||
Fails BOOST_CHECK(!CScript::IsPayToAnchor(1, {0x4e, 0x00})) in script_standard_tests.cpp.
</details>
<details> <summary><a href="https://mutanthub.space/mutants/560">script.cpp:292</a>: <code>if (i)</code> -> <code>if (1==1)</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -292,1 +292,1 @@ std::string CScriptWitness::ToString() const
- if (i) {
+ if (1==1) {
Fails BOOST_CHECK_EQUAL(wit_single.ToString(), "CScriptWitness(0102)") in script_tests.cpp.
</details>
<details> <summary><a href="https://mutanthub.space/mutants/563">script.cpp:306</a>: <code>opcode > MAX_OPCODE</code> -> <code>>= MAX_OPCODE</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -306,1 +306,1 @@ bool CScript::HasValidOps() const
- if (!GetOp(it, opcode, item) || opcode > MAX_OPCODE || item.size() > MAX_SCRIPT_ELEMENT_SIZE) {
+ if (!GetOp(it, opcode, item) || opcode >= MAX_OPCODE || item.size() > MAX_SCRIPT_ELEMENT_SIZE) {
Fails BOOST_CHECK(script.HasValidOps()) on OP_NOP10 in script_tests.cpp.
</details>
<details> <summary>script.cpp:337, 343, 350: <code>return false</code> -> <code>return true</code> on truncated pushdata lengths</summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -337,1 +337,1 @@ bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator en
- return false;
+ return true;
@@ -343,1 +343,1 @@ bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator en
- return false;
+ return true;
@@ -350,1 +350,1 @@ bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator en
- return false;
+ return true;
Fails BOOST_CHECK(!s.GetOp(it, opcode, data)) on truncated OP_PUSHDATA1/2/4 scripts in script_tests.cpp.
</details>
<details> <summary>script.cpp:243: <code>size() == 34</code> -> <code>>= 34</code></summary>
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -243,1 +243,1 @@ bool CScript::IsPayToTaproot() const
- return (this->size() == 34 &&
+ return (this->size() >= 34 &&
Fails BOOST_CHECK(!CScript(bytes.begin(), bytes.end()).IsPayToTaproot()) for oversized scripts in script_segwit_tests.cpp.
</details>
Review per commit recommended.