From beb0710d4696ba1ef28868dfc8cc0c54be31a8f5 Mon Sep 17 00:00:00 2001 From: Richard Holland Date: Mon, 23 Jan 2023 12:18:00 +0000 Subject: [PATCH] add max state object modification test to state_set unit test --- src/ripple/app/hook/Guard.h | 18 ---- src/ripple/app/hook/impl/applyHook.cpp | 2 +- src/test/app/SetHook_test.cpp | 144 ++++++++++++++++++++++++- src/test/app/SetHook_wasm.h | 119 ++++++++++++++++---- 4 files changed, 241 insertions(+), 42 deletions(-) diff --git a/src/ripple/app/hook/Guard.h b/src/ripple/app/hook/Guard.h index f14692d93..21481036a 100644 --- a/src/ripple/app/hook/Guard.h +++ b/src/ripple/app/hook/Guard.h @@ -1342,22 +1342,4 @@ validateGuards( return std::pair{maxInstrCountHook, maxInstrCountCbak}; - /* - GUARDLOG(hook::log::WASM_SMOKE_TEST) - << "Trying to wasm instantiate proposed hook " - << "size = " << hook.size() << "\n"; - - std::optional result = - hook::HookExecutor::validateWasm(hook.data(), (size_t)hook.size()); - - if (result) - { - GUARDLOG(hook::log::WASM_TEST_FAILURE) - << "Tried to set a hook with invalid code. VM error: " - << *result << "\n"; - return {}; - } - */ - - return std::pair{maxInstrCountHook, maxInstrCountCbak}; } diff --git a/src/ripple/app/hook/impl/applyHook.cpp b/src/ripple/app/hook/impl/applyHook.cpp index db0e58f00..1c5b6d30b 100644 --- a/src/ripple/app/hook/impl/applyHook.cpp +++ b/src/ripple/app/hook/impl/applyHook.cpp @@ -1535,7 +1535,7 @@ finalizeHookState( if (is_modified) { changeCount++; - if (changeCount >= 0xFFFFU) // RH TODO: limit the max number of state changes? + if (changeCount > max_state_modifications + 1) { // overflow JLOG(j.warn()) diff --git a/src/test/app/SetHook_test.cpp b/src/test/app/SetHook_test.cpp index 72732dad6..53e02c2f6 100644 --- a/src/test/app/SetHook_test.cpp +++ b/src/test/app/SetHook_test.cpp @@ -8195,11 +8195,15 @@ public: auto const bob = Account{"bob"}; auto const alice = Account{"alice"}; auto const cho = Account{"cho"}; + auto const david = Account{"david"}; + auto const eve = Account{"eve"}; // small balance + auto const frank = Account{"frank"}; // big balance env.fund(XRP(10000), alice); env.fund(XRP(10000), bob); env.fund(XRP(10000), cho); - - + env.fund(XRP(1000000), david); + env.fund(XRP(2600), eve); + env.fund(XRP(1000000000), frank); // install a rollback hook on cho env(ripple::test::jtx::hook(cho, {{hso(rollback_wasm, overrideFlag)}}, 0), @@ -8755,11 +8759,143 @@ public: BEAST_EXPECT((*env.le("alice"))[sfOwnerCount] == 3); } + + // check reserve exhaustion + TestHook exhaustion_wasm = wasm[R"[test.hook]( + #include + #define sfInvoiceID ((5U << 16U) + 17U) + extern int32_t _g (uint32_t id, uint32_t maxiter); + #define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1) + extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t otxn_field (uint32_t, uint32_t, uint32_t); + extern int64_t otxn_id(uint32_t, uint32_t, uint32_t); + extern int64_t state_set ( + uint32_t, uint32_t, uint32_t, uint32_t + ); + extern int64_t hook_pos(void); + #define SBUF(x) (uint32_t)(x), sizeof(x) + #define ASSERT(x)\ + if (!(x))\ + rollback((uint32_t)#x, sizeof(#x), __LINE__); + int64_t hook(uint32_t reserved ) + { + _g(1,1); + + // get this transaction id + uint8_t txn[32]; + ASSERT(otxn_id(SBUF(txn), 0) == 32); + + // get the invoice id, which contains the grantor account + uint8_t grantor[32]; + ASSERT(otxn_field(SBUF(grantor), sfInvoiceID) == 32); + + uint16_t iterations = (((uint16_t)grantor[0]) << 8U) + ((uint16_t)grantor[1]); + + uint8_t p = hook_pos(); + for (uint16_t i = 0; GUARD(1500), i < iterations; ++i) + { + *((uint16_t*)txn) = i; + txn[2] = (uint8_t)p; + ASSERT(state_set(SBUF(txn), SBUF(txn)) == 32); + } + + return accept(0,0,0); + } + )[test.hook]"]; + + HASH_WASM(exhaustion); + + // install the exhaustion hook on eve + { + Json::Value json = ripple::test::jtx::hook(eve, {{hso(exhaustion_wasm, overrideFlag)}}, 0); + + env(json, + M("set state_set 6"), + HSFEE); + env.close(); + } + + // now invoke repeatedly until exhaustion is reached + { + + Json::Value json = pay(david, eve, XRP(1)); + json[jss::InvoiceID] = "0001" + std::string(60, '0'); + + // 2500 xrp less 1 account reserve (200) divided by 50xrp per object reserve = 46 objects + // of these we already have: 1 hook, so 45 objects can be allocated + env(json, fee(XRP(1)), + M("test state_set 7"), + ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 2); + + // now we have allocated 1 state object, so 44 more can be allocated + + // try to set 45 state entries, this will fail + json[jss::InvoiceID] = "002D" + std::string(60, '0'); + env(json, fee(XRP(1)), + M("test state_set 8"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 2); + + + // try to set 44 state objects, this will succeed + json[jss::InvoiceID] = "002C" + std::string(60, '0'); + env(json, fee(XRP(1)), + M("test state_set 9"), + ter(tesSUCCESS)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 46); + + + // try to set one state object, this will fail + env(json, fee(XRP(1)), + M("test state_set 10"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("eve"))[sfOwnerCount] == 46); + } + + // test maximum state modification + { + // install the hook into every position on frank + env(ripple::test::jtx::hook( + frank, {{ + hso(exhaustion_wasm), + hso(exhaustion_wasm), + hso(exhaustion_wasm), + hso(exhaustion_wasm) + }}, 0), + M("set state_set 11"), + HSFEE, + ter(tesSUCCESS)); + + Json::Value json = pay(david, frank, XRP(1)); + + // we can modify 1500 entries at a time with the hook, but first we want to test too many modifications + // so we will do 1251 which times 4 executions is 5005 + json[jss::InvoiceID] = "04E3" + std::string(60, '0'); + env(json, fee(XRP(1)), + M("test state_set 12"), + ter(tecHOOK_REJECTED)); + env.close(); + BEAST_EXPECT((*env.le("frank"))[sfOwnerCount] == 4); + + // now we will do 1250 which is exactly 5000, which should be accepted + json[jss::InvoiceID] = "04E2" + std::string(60, '0'); + env(json, fee(XRP(1)), + M("test state_set 13"), + ter(tesSUCCESS)); + env.close(); + std::cout << "frank ownercount: " << (*env.le("frank"))[sfOwnerCount] << "\n"; + BEAST_EXPECT((*env.le("frank"))[sfOwnerCount] == 5004); + } + // RH TODO: // check state can be set on emit callback - // check reserve - cant make new state object if reserve insufficient - // try creating many new state objects // check namespacing provides for non-collision of same key } diff --git a/src/test/app/SetHook_wasm.h b/src/test/app/SetHook_wasm.h index b726dec9f..3d5647ff2 100644 --- a/src/test/app/SetHook_wasm.h +++ b/src/test/app/SetHook_wasm.h @@ -9989,6 +9989,87 @@ std::map> wasm = { }}, /* ==== WASM: 69 ==== */ +{ R"[test.hook]( + #include + #define sfInvoiceID ((5U << 16U) + 17U) + extern int32_t _g (uint32_t id, uint32_t maxiter); + #define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1) + extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code); + extern int64_t otxn_field (uint32_t, uint32_t, uint32_t); + extern int64_t otxn_id(uint32_t, uint32_t, uint32_t); + extern int64_t state_set ( + uint32_t, uint32_t, uint32_t, uint32_t + ); + extern int64_t hook_pos(void); + #define SBUF(x) (uint32_t)(x), sizeof(x) + #define ASSERT(x)\ + if (!(x))\ + rollback((uint32_t)#x, sizeof(#x), __LINE__); + + int64_t hook(uint32_t reserved ) + { + _g(1,1); + + // get this transaction id + uint8_t txn[32]; + ASSERT(otxn_id(SBUF(txn), 0) == 32); + + // get the invoice id, which contains the grantor account + uint8_t grantor[32]; + ASSERT(otxn_field(SBUF(grantor), sfInvoiceID) == 32); + + uint16_t iterations = (((uint16_t)grantor[0]) << 8U) + ((uint16_t)grantor[1]); + + uint8_t p = hook_pos(); + for (uint16_t i = 0; GUARD(1500), i < iterations; ++i) + { + *((uint16_t*)txn) = i; + txn[2] = (uint8_t)p; + ASSERT(state_set(SBUF(txn), SBUF(txn)) == 32); + } + + return accept(0,0,0); + } + )[test.hook]", +{ + 0x00U,0x61U,0x73U,0x6DU,0x01U,0x00U,0x00U,0x00U,0x01U,0x26U,0x06U,0x60U,0x02U,0x7FU,0x7FU,0x01U,0x7FU,0x60U,0x03U, + 0x7FU,0x7FU,0x7FU,0x01U,0x7EU,0x60U,0x03U,0x7FU,0x7FU,0x7EU,0x01U,0x7EU,0x60U,0x00U,0x01U,0x7EU,0x60U,0x04U,0x7FU, + 0x7FU,0x7FU,0x7FU,0x01U,0x7EU,0x60U,0x01U,0x7FU,0x01U,0x7EU,0x02U,0x64U,0x07U,0x03U,0x65U,0x6EU,0x76U,0x02U,0x5FU, + 0x67U,0x00U,0x00U,0x03U,0x65U,0x6EU,0x76U,0x07U,0x6FU,0x74U,0x78U,0x6EU,0x5FU,0x69U,0x64U,0x00U,0x01U,0x03U,0x65U, + 0x6EU,0x76U,0x08U,0x72U,0x6FU,0x6CU,0x6CU,0x62U,0x61U,0x63U,0x6BU,0x00U,0x02U,0x03U,0x65U,0x6EU,0x76U,0x0AU,0x6FU, + 0x74U,0x78U,0x6EU,0x5FU,0x66U,0x69U,0x65U,0x6CU,0x64U,0x00U,0x01U,0x03U,0x65U,0x6EU,0x76U,0x08U,0x68U,0x6FU,0x6FU, + 0x6BU,0x5FU,0x70U,0x6FU,0x73U,0x00U,0x03U,0x03U,0x65U,0x6EU,0x76U,0x09U,0x73U,0x74U,0x61U,0x74U,0x65U,0x5FU,0x73U, + 0x65U,0x74U,0x00U,0x04U,0x03U,0x65U,0x6EU,0x76U,0x06U,0x61U,0x63U,0x63U,0x65U,0x70U,0x74U,0x00U,0x02U,0x03U,0x02U, + 0x01U,0x05U,0x05U,0x03U,0x01U,0x00U,0x02U,0x06U,0x21U,0x05U,0x7FU,0x01U,0x41U,0xF0U,0x88U,0x04U,0x0BU,0x7FU,0x00U, + 0x41U,0xEFU,0x08U,0x0BU,0x7FU,0x00U,0x41U,0x80U,0x08U,0x0BU,0x7FU,0x00U,0x41U,0xF0U,0x88U,0x04U,0x0BU,0x7FU,0x00U, + 0x41U,0x80U,0x08U,0x0BU,0x07U,0x08U,0x01U,0x04U,0x68U,0x6FU,0x6FU,0x6BU,0x00U,0x07U,0x0AU,0xB2U,0x82U,0x00U,0x01U, + 0xAEU,0x82U,0x00U,0x03U,0x03U,0x7FU,0x01U,0x7EU,0x01U,0x7FU,0x23U,0x80U,0x80U,0x80U,0x80U,0x00U,0x41U,0xC0U,0x00U, + 0x6BU,0x22U,0x01U,0x24U,0x80U,0x80U,0x80U,0x80U,0x00U,0x41U,0x01U,0x41U,0x01U,0x10U,0x80U,0x80U,0x80U,0x80U,0x00U, + 0x1AU,0x02U,0x40U,0x20U,0x01U,0x41U,0x20U,0x6AU,0x41U,0x20U,0x41U,0x00U,0x10U,0x81U,0x80U,0x80U,0x80U,0x00U,0x42U, + 0x20U,0x51U,0x0DU,0x00U,0x41U,0x80U,0x88U,0x80U,0x80U,0x00U,0x41U,0x1CU,0x42U,0x19U,0x10U,0x82U,0x80U,0x80U,0x80U, + 0x00U,0x1AU,0x0BU,0x02U,0x40U,0x20U,0x01U,0x41U,0x20U,0x41U,0x91U,0x80U,0x14U,0x10U,0x83U,0x80U,0x80U,0x80U,0x00U, + 0x42U,0x20U,0x51U,0x0DU,0x00U,0x41U,0x9CU,0x88U,0x80U,0x80U,0x00U,0x41U,0x2DU,0x42U,0x1DU,0x10U,0x82U,0x80U,0x80U, + 0x80U,0x00U,0x1AU,0x0BU,0x20U,0x01U,0x2DU,0x00U,0x01U,0x21U,0x02U,0x20U,0x01U,0x2DU,0x00U,0x00U,0x21U,0x03U,0x10U, + 0x84U,0x80U,0x80U,0x80U,0x00U,0x21U,0x04U,0x41U,0xA2U,0x80U,0x80U,0x80U,0x78U,0x41U,0xDDU,0x0BU,0x10U,0x80U,0x80U, + 0x80U,0x80U,0x00U,0x1AU,0x02U,0x40U,0x20U,0x02U,0x20U,0x03U,0x41U,0x08U,0x74U,0x72U,0x22U,0x03U,0x45U,0x0DU,0x00U, + 0x20U,0x04U,0xA7U,0x21U,0x05U,0x41U,0x00U,0x21U,0x02U,0x03U,0x40U,0x41U,0xA2U,0x80U,0x80U,0x80U,0x78U,0x41U,0xDDU, + 0x0BU,0x10U,0x80U,0x80U,0x80U,0x80U,0x00U,0x1AU,0x20U,0x01U,0x20U,0x05U,0x3AU,0x00U,0x22U,0x20U,0x01U,0x20U,0x02U, + 0x3BU,0x01U,0x20U,0x02U,0x40U,0x20U,0x01U,0x41U,0x20U,0x6AU,0x41U,0x20U,0x20U,0x01U,0x41U,0x20U,0x6AU,0x41U,0x20U, + 0x10U,0x85U,0x80U,0x80U,0x80U,0x00U,0x42U,0x20U,0x51U,0x0DU,0x00U,0x41U,0xC9U,0x88U,0x80U,0x80U,0x00U,0x41U,0x26U, + 0x42U,0x26U,0x10U,0x82U,0x80U,0x80U,0x80U,0x00U,0x1AU,0x0BU,0x20U,0x03U,0x20U,0x02U,0x41U,0x01U,0x6AU,0x22U,0x02U, + 0x41U,0xFFU,0xFFU,0x03U,0x71U,0x4BU,0x0DU,0x00U,0x0BU,0x0BU,0x41U,0x00U,0x41U,0x00U,0x42U,0x00U,0x10U,0x86U,0x80U, + 0x80U,0x80U,0x00U,0x21U,0x04U,0x20U,0x01U,0x41U,0xC0U,0x00U,0x6AU,0x24U,0x80U,0x80U,0x80U,0x80U,0x00U,0x20U,0x04U, + 0x0BU,0x0BU,0x76U,0x01U,0x00U,0x41U,0x80U,0x08U,0x0BU,0x6FU,0x6FU,0x74U,0x78U,0x6EU,0x5FU,0x69U,0x64U,0x28U,0x53U, + 0x42U,0x55U,0x46U,0x28U,0x74U,0x78U,0x6EU,0x29U,0x2CU,0x20U,0x30U,0x29U,0x20U,0x3DU,0x3DU,0x20U,0x33U,0x32U,0x00U, + 0x6FU,0x74U,0x78U,0x6EU,0x5FU,0x66U,0x69U,0x65U,0x6CU,0x64U,0x28U,0x53U,0x42U,0x55U,0x46U,0x28U,0x67U,0x72U,0x61U, + 0x6EU,0x74U,0x6FU,0x72U,0x29U,0x2CU,0x20U,0x73U,0x66U,0x49U,0x6EU,0x76U,0x6FU,0x69U,0x63U,0x65U,0x49U,0x44U,0x29U, + 0x20U,0x3DU,0x3DU,0x20U,0x33U,0x32U,0x00U,0x73U,0x74U,0x61U,0x74U,0x65U,0x5FU,0x73U,0x65U,0x74U,0x28U,0x53U,0x42U, + 0x55U,0x46U,0x28U,0x74U,0x78U,0x6EU,0x29U,0x2CU,0x20U,0x53U,0x42U,0x55U,0x46U,0x28U,0x74U,0x78U,0x6EU,0x29U,0x29U, + 0x20U,0x3DU,0x3DU,0x20U,0x33U,0x32U,0x00U, +}}, + +/* ==== WASM: 70 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10393,7 +10474,7 @@ std::map> wasm = { 0x00U, }}, -/* ==== WASM: 70 ==== */ +/* ==== WASM: 71 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10633,7 +10714,7 @@ std::map> wasm = { 0x3DU,0x3DU,0x20U,0x30U,0x00U, }}, -/* ==== WASM: 71 ==== */ +/* ==== WASM: 72 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10730,7 +10811,7 @@ std::map> wasm = { 0x44U,0x4FU,0x45U,0x53U,0x4EU,0x54U,0x5FU,0x45U,0x58U,0x49U,0x53U,0x54U,0x00U, }}, -/* ==== WASM: 72 ==== */ +/* ==== WASM: 73 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10852,7 +10933,7 @@ std::map> wasm = { 0x58U,0x49U,0x53U,0x54U,0x00U, }}, -/* ==== WASM: 73 ==== */ +/* ==== WASM: 74 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -10960,7 +11041,7 @@ std::map> wasm = { 0x20U,0x3DU,0x3DU,0x20U,0x30U,0x00U,0x22U,0x00U,0x00U,0x00U,0x00U, }}, -/* ==== WASM: 74 ==== */ +/* ==== WASM: 75 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11025,7 +11106,7 @@ std::map> wasm = { 0x65U,0x28U,0x30U,0x2CU,0x31U,0x2CU,0x32U,0x2CU,0x33U,0x2CU,0x31U,0x29U,0x20U,0x3DU,0x3DU,0x20U,0x30U,0x00U, }}, -/* ==== WASM: 75 ==== */ +/* ==== WASM: 76 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11068,7 +11149,7 @@ std::map> wasm = { 0x5FU,0x42U,0x4FU,0x55U,0x4EU,0x44U,0x53U,0x00U, }}, -/* ==== WASM: 76 ==== */ +/* ==== WASM: 77 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -11111,7 +11192,7 @@ std::map> wasm = { 0x53U,0x00U, }}, -/* ==== WASM: 77 ==== */ +/* ==== WASM: 78 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -12192,7 +12273,7 @@ std::map> wasm = { 0x30U,0x29U,0x20U,0x3DU,0x3DU,0x20U,0x54U,0x4FU,0x4FU,0x5FU,0x53U,0x4DU,0x41U,0x4CU,0x4CU,0x00U, }}, -/* ==== WASM: 78 ==== */ +/* ==== WASM: 79 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -13128,7 +13209,7 @@ std::map> wasm = { 0x6EU,0x73U,0x29U,0x2CU,0x20U,0x30U,0x2CU,0x30U,0x20U,0x29U,0x29U,0x00U, }}, -/* ==== WASM: 79 ==== */ +/* ==== WASM: 80 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -14878,7 +14959,7 @@ std::map> wasm = { 0x41U,0x4CU,0x4CU,0x00U, }}, -/* ==== WASM: 80 ==== */ +/* ==== WASM: 81 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16080,7 +16161,7 @@ std::map> wasm = { 0x32U,0x30U,0x29U,0x20U,0x3DU,0x3DU,0x20U,0x54U,0x4FU,0x4FU,0x5FU,0x53U,0x4DU,0x41U,0x4CU,0x4CU,0x00U, }}, -/* ==== WASM: 81 ==== */ +/* ==== WASM: 82 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16275,7 +16356,7 @@ std::map> wasm = { 0x75U,0x62U,0x6BU,0x65U,0x79U,0x5FU,0x65U,0x64U,0x29U,0x29U,0x20U,0x3DU,0x3DU,0x20U,0x30U,0x00U, }}, -/* ==== WASM: 82 ==== */ +/* ==== WASM: 83 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16297,7 +16378,7 @@ std::map> wasm = { 0x00U,0x10U,0x81U,0x80U,0x80U,0x80U,0x00U,0x0BU, }}, -/* ==== WASM: 83 ==== */ +/* ==== WASM: 84 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -16321,7 +16402,7 @@ std::map> wasm = { 0x80U,0x08U,0x0BU,0x0EU,0x48U,0x6FU,0x6FU,0x6BU,0x20U,0x52U,0x65U,0x6AU,0x65U,0x63U,0x74U,0x65U,0x64U,0x00U, }}, -/* ==== WASM: 84 ==== */ +/* ==== WASM: 85 ==== */ { R"[test.hook]( (module (type (;0;) (func (param i32 i32 i64) (result i64))) @@ -16344,7 +16425,7 @@ std::map> wasm = { 0x42U,0x00U,0x10U,0x00U,0x0BU, }}, -/* ==== WASM: 85 ==== */ +/* ==== WASM: 86 ==== */ { R"[test.hook]( (module (type (;0;) (func (param i32 i32) (result i32))) @@ -16389,7 +16470,7 @@ std::map> wasm = { 0x0BU,0x09U,0x00U,0x41U,0x01U,0x41U,0x01U,0x10U,0x00U,0x1AU,0x0BU, }}, -/* ==== WASM: 86 ==== */ +/* ==== WASM: 87 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -19895,7 +19976,7 @@ std::map> wasm = { 0x33U,0x00U, }}, -/* ==== WASM: 87 ==== */ +/* ==== WASM: 88 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter); @@ -19928,7 +20009,7 @@ std::map> wasm = { 0x00U,0x41U,0x80U,0x08U,0x0BU,0x06U,0x76U,0x61U,0x6CU,0x75U,0x65U,0x00U, }}, -/* ==== WASM: 88 ==== */ +/* ==== WASM: 89 ==== */ { R"[test.hook]( #include extern int32_t _g (uint32_t id, uint32_t maxiter);