fuzz: Add tests for CCoinControl methods
What changed, and why it matters
This commit only adds new test code for an existing Bitcoin Core wallet component. It expands a fuzzing harness to exercise more methods of the CCoinControl class, which is used to choose which coins are spent in transactions. There is no change to production wallet logic, no bug fix, and no security patch.
No security action needed. Treat as routine test-quality improvement.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff adds eight new fuzzing actions to src/wallet/test/fuzz/coincontrol.cpp. They call CCoinControl/CInputCoin methods such as GetScripts, GetSelectionPos, Select, SetSequence, SetScriptSig, SetScriptWitness, and SetPosition, with assertions checking consistency between the returned input object and the coin control object. The production code under test is unchanged; only test coverage is increased.
Changed components
src/wallet/test/fuzz/coincontrol.cppInspect captured patch +40 / −0
diff --git a/src/wallet/test/fuzz/coincontrol.cpp b/src/wallet/test/fuzz/coincontrol.cpp
index e46a469f..870eab89 100644
--- a/src/wallet/test/fuzz/coincontrol.cpp
+++ b/src/wallet/test/fuzz/coincontrol.cpp
@@ -99,6 +99,46 @@ FUZZ_TARGET(coincontrol, .init = initialize_coincontrol)
const bool is_selected = coin_control.IsSelected(out_point);
assert(!coin_control.GetInputWeight(out_point) || is_selected);
assert(!coin_control.GetSequence(out_point) || is_selected);
+ },
+ [&] {
+ const auto scripts = coin_control.GetScripts(out_point);
+ assert(coin_control.IsSelected(out_point) || (!scripts.first && !scripts.second));
+ },
+ [&] {
+ assert(coin_control.HasSelectedOrder() || !coin_control.GetSelectionPos(out_point));
+ },
+ [&] {
+ assert(!coin_control.GetSelectionPos(out_point) || coin_control.IsSelected(out_point));
+ },
+ [&] {
+ auto& input = coin_control.Select(out_point);
+ uint32_t sequence{fuzzed_data_provider.ConsumeIntegral<uint32_t>()};
+ input.SetSequence(sequence);
+ assert(input.GetSequence() == sequence);
+ assert(coin_control.GetSequence(out_point) == sequence);
+ },
+ [&] {
+ auto& input = coin_control.Select(out_point);
+ const CScript script{ConsumeScript(fuzzed_data_provider)};
+ input.SetScriptSig(script);
+ assert(input.HasScripts());
+ assert(input.GetScripts().first == script);
+ assert(coin_control.GetScripts(out_point).first == script);
+ },
+ [&] {
+ auto& input = coin_control.Select(out_point);
+ const CScriptWitness script_wit{ConsumeScriptWitness(fuzzed_data_provider)};
+ input.SetScriptWitness(script_wit);
+ assert(input.HasScripts());
+ assert(input.GetScripts().second->stack == script_wit.stack);
+ assert(coin_control.GetScripts(out_point).second->stack == script_wit.stack);
+ },
+ [&] {
+ auto& input = coin_control.Select(out_point);
+ unsigned int pos{fuzzed_data_provider.ConsumeIntegral<unsigned int>()};
+ input.SetPosition(pos);
+ assert(input.GetPosition() == pos);
+ assert(coin_control.GetSelectionPos(out_point) == pos);
});
}
}
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.