From 75c1159d7300e1eab9b924d83e69f415a964739f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 29 Feb 2024 10:40:07 -0600 Subject: [PATCH] add test showing two internal call example is caught --- .../functions/out_of_order_retryable.py | 1 + ...e_0_8_20_out_of_order_retryable_sol__0.txt | 4 ++++ .../0.8.20/out_of_order_retryable.sol | 6 +++++- .../out_of_order_retryable.sol-0.8.20.zip | Bin 5942 -> 6058 bytes 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/slither/detectors/functions/out_of_order_retryable.py b/slither/detectors/functions/out_of_order_retryable.py index f483dc64a..db9096f95 100644 --- a/slither/detectors/functions/out_of_order_retryable.py +++ b/slither/detectors/functions/out_of_order_retryable.py @@ -72,6 +72,7 @@ Bob calls `doStuffOnL2` but the first retryable ticket calling `claim_rewards` f key = "OUTOFORDERRETRYABLE" + # pylint: disable=too-many-branches def _detect_multiple_tickets( self, function: FunctionContract, node: Node, visited: List[Node] ) -> None: diff --git a/tests/e2e/detectors/snapshots/detectors__detector_OutOfOrderRetryable_0_8_20_out_of_order_retryable_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_OutOfOrderRetryable_0_8_20_out_of_order_retryable_sol__0.txt index a54b2240d..4b0371a8c 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_OutOfOrderRetryable_0_8_20_out_of_order_retryable_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_OutOfOrderRetryable_0_8_20_out_of_order_retryable_sol__0.txt @@ -2,6 +2,10 @@ Multiple retryable tickets created in the same function: -Y(msg.sender).createRetryableTicket(address(1),0,0,address(0),address(0),0,0,) (tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol#62-70) -Y(msg.sender).createRetryableTicket(address(2),0,0,address(0),address(0),0,0,) (tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol#72-80) +Multiple retryable tickets created in the same function: + -good2() (tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol#95) + -good2() (tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol#96) + Multiple retryable tickets created in the same function: -Y(msg.sender).createRetryableTicket(address(1),0,0,address(0),address(0),0,0,) (tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol#40-48) -Y(msg.sender).createRetryableTicket(address(2),0,0,address(0),address(0),0,0,) (tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol#50-58) diff --git a/tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol b/tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol index af20814a5..e3f8feb2e 100644 --- a/tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol +++ b/tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol @@ -90,7 +90,11 @@ function bad3() external { 0, ""); good2(); -} +} +function bad4() external { + good2(); + good2(); +} function good2() internal { Y(msg.sender).createRetryableTicket( address(2), diff --git a/tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol-0.8.20.zip b/tests/e2e/detectors/test_data/out-of-order-retryable/0.8.20/out_of_order_retryable.sol-0.8.20.zip index 604b64ae7a38a632dcaeafeae1bc773299210399..fd52cf1802ca8d58c5c02b660f1657cc9b69d2da 100644 GIT binary patch delta 5778 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 QX;_oq7E%T{7XSbN01k^cP5=M^ delta 5676 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 S0001QlV=w_2E-Ns0000emIV0#