From 24bcad3d4df59690f30c9df8ebb62f0bddd0f1c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Tue, 4 Nov 2025 22:48:56 +0100 Subject: [PATCH] refactor: remove dead code in `CountWitnessSigOps` Found while reviewing #32840 The `nullptr` witness path was dead in normal code paths: removing it deletes unreachable logic. Code coverage proof: https://maflcko.github.io/b-c-cov/total.coverage/src/script/interpreter.cpp.gcov.html#L2135 --- src/consensus/tx_verify.cpp | 2 +- src/script/interpreter.cpp | 8 +++----- src/script/interpreter.h | 2 +- src/test/fuzz/coins_view.cpp | 2 +- src/test/fuzz/script.cpp | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp index 9d09872597a..c38b96434ae 100644 --- a/src/consensus/tx_verify.cpp +++ b/src/consensus/tx_verify.cpp @@ -156,7 +156,7 @@ int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& i const Coin& coin = inputs.AccessCoin(tx.vin[i].prevout); assert(!coin.IsSpent()); const CTxOut &prevout = coin.out; - nSigOps += CountWitnessSigOps(tx.vin[i].scriptSig, prevout.scriptPubKey, &tx.vin[i].scriptWitness, flags); + nSigOps += CountWitnessSigOps(tx.vin[i].scriptSig, prevout.scriptPubKey, tx.vin[i].scriptWitness, flags); } return nSigOps; } diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index abd99fc365e..6505ffe5a7a 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -2132,10 +2132,8 @@ size_t static WitnessSigOps(int witversion, const std::vector& wi return 0; } -size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags) +size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness& witness, script_verify_flags flags) { - static const CScriptWitness witnessEmpty; - if ((flags & SCRIPT_VERIFY_WITNESS) == 0) { return 0; } @@ -2144,7 +2142,7 @@ size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, int witnessversion; std::vector witnessprogram; if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) { - return WitnessSigOps(witnessversion, witnessprogram, witness ? *witness : witnessEmpty); + return WitnessSigOps(witnessversion, witnessprogram, witness); } if (scriptPubKey.IsPayToScriptHash() && scriptSig.IsPushOnly()) { @@ -2156,7 +2154,7 @@ size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, } CScript subscript(data.begin(), data.end()); if (subscript.IsWitnessProgram(witnessversion, witnessprogram)) { - return WitnessSigOps(witnessversion, witnessprogram, witness ? *witness : witnessEmpty); + return WitnessSigOps(witnessversion, witnessprogram, witness); } } diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 7f8a1f7a411..cbb137e09ef 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -377,7 +377,7 @@ bool EvalScript(std::vector >& stack, const CScript& bool EvalScript(std::vector >& stack, const CScript& script, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = nullptr); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags, const BaseSignatureChecker& checker, ScriptError* serror = nullptr); -size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags); +size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness& witness, script_verify_flags flags); int FindAndDelete(CScript& script, const CScript& b); diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp index c687065423a..dceec3d2a2a 100644 --- a/src/test/fuzz/coins_view.cpp +++ b/src/test/fuzz/coins_view.cpp @@ -283,7 +283,7 @@ void TestCoinsView(FuzzedDataProvider& fuzzed_data_provider, CCoinsView& backend const auto flags = script_verify_flags::from_int(fuzzed_data_provider.ConsumeIntegral()); if (!transaction.vin.empty() && (flags & SCRIPT_VERIFY_WITNESS) != 0 && (flags & SCRIPT_VERIFY_P2SH) == 0) { // Avoid: - // script/interpreter.cpp:1705: size_t CountWitnessSigOps(const CScript &, const CScript &, const CScriptWitness *, unsigned int): Assertion `(flags & SCRIPT_VERIFY_P2SH) != 0' failed. + // script/interpreter.cpp:1705: size_t CountWitnessSigOps(const CScript &, const CScript &, const CScriptWitness &, unsigned int): Assertion `(flags & SCRIPT_VERIFY_P2SH) != 0' failed. return; } (void)GetTransactionSigOpCost(transaction, coins_view_cache, flags); diff --git a/src/test/fuzz/script.cpp b/src/test/fuzz/script.cpp index dfad0b71848..9d3ce27ae3d 100644 --- a/src/test/fuzz/script.cpp +++ b/src/test/fuzz/script.cpp @@ -125,7 +125,7 @@ FUZZ_TARGET(script, .init = initialize_script) for (const auto& s : random_string_vector) { wit.stack.emplace_back(s.begin(), s.end()); } - (void)CountWitnessSigOps(script, *other_script, &wit, flags); + (void)CountWitnessSigOps(script, *other_script, wit, flags); wit.SetNull(); } }