From 8b8ff1c7d5bfbe58c2a8af3dd9e47fbda84a018b Mon Sep 17 00:00:00 2001 From: fanquake Date: Tue, 15 Aug 2023 10:52:24 +0100 Subject: [PATCH] Merge bitcoin/bitcoin#28215: fuzz: fix a couple incorrect assertions in the `coins_view` target e417c988f61bf9d3948d5c8e169626922fe6e24c fuzz: coins_view: remove an incorrect assertion (Antoine Poinsot) c5f6b1db56f67f529377bfb61f58c0a8c17b0127 fuzz: coins_view: correct an incorrect assertion (Antoine Poinsot) Pull request description: The `coins_view` fuzz target would assert in two places that the cache is consistent with the backend. But it's never the case (that's the whole point of using a cache). The only reason this didn't result in a crash was that we would never actually hit these assertions. I ran into this while introducing a new target with an in-memory `CCoinsViewDB` as the backend view (see https://github.com/bitcoin/bitcoin/pull/28216) which made the code paths with those assertions actually reachable. ACKs for top commit: dergoegge: Code review ACK e417c988f61bf9d3948d5c8e169626922fe6e24c Tree-SHA512: 5847bb2744a2f2831dace62d32b79cc491bf54e2af4ce425411d245d566622d9aff816d9be5ec8e830d10851c13f2500bf4f0c004d88b4d7cca1d483ef8960a6 --- src/test/fuzz/coins_view.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/fuzz/coins_view.cpp b/src/test/fuzz/coins_view.cpp index 8634f6e9be..ef3dcc7e55 100644 --- a/src/test/fuzz/coins_view.cpp +++ b/src/test/fuzz/coins_view.cpp @@ -158,14 +158,16 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view) } assert((exists_using_access_coin && exists_using_have_coin_in_cache && exists_using_have_coin && exists_using_get_coin) || (!exists_using_access_coin && !exists_using_have_coin_in_cache && !exists_using_have_coin && !exists_using_get_coin)); + // If HaveCoin on the backend is true, it must also be on the cache if the coin wasn't spent. const bool exists_using_have_coin_in_backend = backend_coins_view.HaveCoin(random_out_point); - if (exists_using_have_coin_in_backend) { + if (!coin_using_access_coin.IsSpent() && exists_using_have_coin_in_backend) { assert(exists_using_have_coin); } Coin coin_using_backend_get_coin; if (backend_coins_view.GetCoin(random_out_point, coin_using_backend_get_coin)) { assert(exists_using_have_coin_in_backend); - assert(coin_using_get_coin == coin_using_backend_get_coin); + // Note we can't assert that `coin_using_get_coin == coin_using_backend_get_coin` because the coin in + // the cache may have been modified but not yet flushed. } else { assert(!exists_using_have_coin_in_backend); }