From 39e3295c71035b960bc9c5d0eeeaed3e06e9d1a6 Mon Sep 17 00:00:00 2001 From: Hodlinator <172445034+hodlinator@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:02:15 +0100 Subject: [PATCH] test(miniscript): Check for depth rather than script size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI failure due to default ~Node() implementation has been confirmed on Windows native, MacOS native, 32-bit ARM, ASan+LSan+UBSan+integer, i686, TSan, MSan. (Not on Alpine as that runs without CI_LIMIT_STACK_SIZE). Co-authored-by: Antoine Poinsot Co-authored-by: Lőrinc --- src/test/miniscript_tests.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/test/miniscript_tests.cpp b/src/test/miniscript_tests.cpp index 2bb96144b0a..b1cfad94fed 100644 --- a/src/test/miniscript_tests.cpp +++ b/src/test/miniscript_tests.cpp @@ -734,18 +734,33 @@ BOOST_AUTO_TEST_CASE(node_stress_stack) using miniscript::Fragment; using NodeU32 = miniscript::Node; + const auto compute_depth{[] (const NodeU32& node) -> size_t { + size_t depth{0}; + for (const auto* n{&node}; !n->Subs().empty(); n = &n->Subs().front()) { + ++depth; + } + return depth; + }}; + constexpr auto ctx{miniscript::MiniscriptContext::TAPSCRIPT}; NodeU32 root{NoDupCheck{}, ctx, Fragment::JUST_1}; - for (uint32_t i{0}; i < 200'000; ++i) { + // Some CI jobs run with CI_LIMIT_STACK_SIZE which reduces the stack size + // via ulimit to 512 kbytes. When tested with ~Node()=default (stack-unsafe) + // implementations the test has been shown to fail for the below depth. + // The test may pass locally despite stack-unsafe implementations unless the + // stack is reduced in a similar way or the depth is temporarily increased. + constexpr size_t depth{200'000}; + for (size_t i{0}; i < depth; ++i) { root = NodeU32{NoDupCheck{}, ctx, Fragment::WRAP_N, Vector(std::move(root))}; } BOOST_CHECK(root.IsValid()); - BOOST_CHECK_EQUAL(root.ScriptSize(), 200'001); + BOOST_CHECK_EQUAL(compute_depth(root), depth); auto clone{root.Clone()}; - BOOST_CHECK_EQUAL(clone.ScriptSize(), root.ScriptSize()); + BOOST_CHECK_EQUAL(compute_depth(clone), depth); clone = std::move(root); + BOOST_CHECK_EQUAL(compute_depth(clone), depth); } BOOST_AUTO_TEST_SUITE_END()