Kills several live mutants in src/script/script.cpp found on https://bitcoincore.space/public/mutation_data.json. They are:
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2346">script.cpp#2346, 2347, 2348</a>: <code>CScript::IsPayToTaproot</code>: size and opcode check operators</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -242,3 +242,3 @@ bool CScript::IsPayToTaproot() const
- return this->size() == 34 &&
- (*this)[0] == OP_1 &&
- (*this)[1] == 0x20;
+ return this->size() == 34 ||
+ (*this)[0] == OP_1 &&
+ (*this)[1] != 0x20;
Covered in src/test/script_segwit_tests.cpp (commit accf04f6e).
</details>
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2326">script.cpp#2326</a>: <code>GetSigOpCount</code>: evaluate scriptSig accurately</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -194,3 +194,3 @@ unsigned int CScript::GetSigOpCount(const CScript& scriptSig) const
if (!IsPayToScriptHash())
- return GetSigOpCount(true);
+ return GetSigOpCount(false);
if (scriptSig.IsPushOnly()) {
Covered in src/test/sigopcount_tests.cpp (commit b9ad09fe3).
</details>
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2325">script.cpp#2325, 2328</a>: <code>GetSigOpCount</code>: multisig boundary checks (OP_1 and OP_16)</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -179,3 +179,3 @@ unsigned int CScript::GetSigOpCount(bool fAccurate) const
- if (lastOpcode >= OP_1 && lastOpcode <= OP_16)
+ if (lastOpcode > OP_1 && lastOpcode <= OP_16)
n += CScript::DecodeOP_N(lastOpcode);
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -204,3 +204,3 @@ unsigned int CScript::GetSigOpCount(const CScript& scriptSig) const
- if (opcode > OP_16)
+ if (opcode >= OP_16)
return n;
Covered in src/test/sigopcount_tests.cpp (commit b9ad09fe3).
</details>
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2337">script.cpp#2337</a>: <code>IsPayToAnchor</code>: payload byte matching conjunction</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -231,4 +231,4 @@ bool CScript::IsPayToAnchor(int version, Span<const unsigned char> program)
return version == 1 &&
program.size() == 2 &&
- program[0] == 0x4e &&
+ (program[0] == 0x4e ||
program[1] == 0x73);
Covered in src/test/script_standard_tests.cpp (commit 559809edd).
</details>
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2365">script.cpp#2365</a>: <code>CScript::HasValidOps</code>: MAX_OPCODE boundary check</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -311,3 +311,3 @@ bool CScript::HasValidOps() const
while (GetOp(it, opcode)) {
- if (opcode > MAX_OPCODE)
+ if (opcode >= MAX_OPCODE)
return false;
Covered in src/test/script_tests.cpp (commit ec4d7b3bd).
</details>
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2372">script.cpp#2372, 2377, 2380, 2383</a>: <code>CScript::GetOp</code>: truncated pushdata lengths</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -49,3 +49,3 @@ bool CScript::GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsi
if (opcode >= 0 && opcode <= OP_PUSHDATA4) {
- if (pc + nSize > pend)
+ if (false)
return false;
Covered in src/test/script_tests.cpp (commit ec4d7b3bd).
</details>
<details> <summary><a href="https://bitcoincore.space/src/script/script.cpp#2362">script.cpp#2362</a>: <code>CScriptWitness::ToString</code>: stack element delimiter condition</summary>
diff --git a/src/script/script.cpp b/src/script/script.cpp
--- a/src/script/script.cpp
+++ b/src/script/script.cpp
@@ -342,3 +342,3 @@ std::string CScriptWitness::ToString() const
for (unsigned i = 0; i < stack.size(); i++) {
- if (i)
+ if (1 == 1)
ret += ", ";
Covered in src/test/script_tests.cpp (commit ec4d7b3bd).
</details>
Recommend reviewing per commit.