From 2d23820ee11678d567c75f94c40011ed9f0e274f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Mon, 3 Nov 2025 12:19:05 +0100 Subject: [PATCH] refactor: remove dead branches in `SingletonClusterImpl` `SplitAll()` always calls `ApplyRemovals()` first, for a singleton, it empties the cluster, therefore any `SingletonClusterImpl` passed to `Split()` must be empty. `TxGraphImpl::ApplyDependencies()` first merges each dependency group and asserts the group has at least one dependency. Since `parent` != `child`, `TxGraphImpl::Merge()` upgrades the merge target to `GenericClusterImpl`, therefore the `ApplyDependencies()` is never dispatched to `SingletonClusterImpl`. Found during review: https://github.com/bitcoin/bitcoin/pull/33157#discussion_r2423058928 Coverage evidence: * https://maflcko.github.io/b-c-cov/fuzz.coverage/src/txgraph.cpp.gcov.html#L1446 * https://storage.googleapis.com/oss-fuzz-coverage/bitcoin-core/reports/20251103/linux/src/bitcoin-core/src/txgraph.cpp.html#L1446 --- src/txgraph.cpp | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/txgraph.cpp b/src/txgraph.cpp index 3a18f60c23d..ae85c546716 100644 --- a/src/txgraph.cpp +++ b/src/txgraph.cpp @@ -1437,16 +1437,9 @@ bool GenericClusterImpl::Split(TxGraphImpl& graph, int level) noexcept bool SingletonClusterImpl::Split(TxGraphImpl& graph, int level) noexcept { Assume(NeedsSplitting()); - if (GetTxCount() == 0) { - // The cluster is now empty. - graph.GetClusterSet(level).m_cluster_usage -= TotalMemoryUsage(); - return true; - } else { - // Nothing changed. - graph.SetClusterQuality(level, m_quality, m_setindex, QualityLevel::OPTIMAL); - Updated(graph, level); - return false; - } + Assume(!GetTxCount()); + graph.GetClusterSet(level).m_cluster_usage -= TotalMemoryUsage(); + return true; } void GenericClusterImpl::Merge(TxGraphImpl& graph, int level, Cluster& other) noexcept @@ -1482,10 +1475,9 @@ void GenericClusterImpl::Merge(TxGraphImpl& graph, int level, Cluster& other) no }); } -void SingletonClusterImpl::Merge(TxGraphImpl& graph, int level, Cluster& other_abstract) noexcept +void SingletonClusterImpl::Merge(TxGraphImpl&, int, Cluster&) noexcept { - // Nothing can be merged into a singleton; it should have been converted to GenericClusterImpl - // first. + // Nothing can be merged into a singleton; it should have been converted to GenericClusterImpl first. Assume(false); } @@ -1537,13 +1529,10 @@ void GenericClusterImpl::ApplyDependencies(TxGraphImpl& graph, int level, std::s Updated(graph, level); } -void SingletonClusterImpl::ApplyDependencies(TxGraphImpl& graph, int level, std::span> to_apply) noexcept +void SingletonClusterImpl::ApplyDependencies(TxGraphImpl&, int, std::span>) noexcept { // Nothing can actually be applied. - for (auto& [par, chl] : to_apply) { - Assume(par == m_graph_index); - Assume(chl == m_graph_index); - } + Assume(false); } TxGraphImpl::~TxGraphImpl() noexcept