From a793c3f1b9f364e0062b6203e04c1a93bac8e164 Mon Sep 17 00:00:00 2001 From: Simone Date: Mon, 20 Nov 2023 11:43:31 +0100 Subject: [PATCH] Don't report if msg.value is in a conditional expression --- .../detectors/statements/msg_value_in_loop.py | 18 ++++++++++ .../msg-value-loop/0.4.25/msg_value_loop.sol | 34 ++++++++++++++++++ .../0.4.25/msg_value_loop.sol-0.4.25.zip | Bin 3539 -> 5783 bytes .../msg-value-loop/0.5.16/msg_value_loop.sol | 34 ++++++++++++++++++ .../0.5.16/msg_value_loop.sol-0.5.16.zip | Bin 3834 -> 6192 bytes .../msg-value-loop/0.6.11/msg_value_loop.sol | 34 ++++++++++++++++++ .../0.6.11/msg_value_loop.sol-0.6.11.zip | Bin 3668 -> 5980 bytes .../msg-value-loop/0.7.6/msg_value_loop.sol | 34 ++++++++++++++++++ .../0.7.6/msg_value_loop.sol-0.7.6.zip | Bin 3593 -> 5820 bytes .../msg-value-loop/0.8.0/msg_value_loop.sol | 34 ++++++++++++++++++ .../0.8.0/msg_value_loop.sol-0.8.0.zip | Bin 4647 -> 6854 bytes 11 files changed, 188 insertions(+) diff --git a/slither/detectors/statements/msg_value_in_loop.py b/slither/detectors/statements/msg_value_in_loop.py index 83c5658ca4..290447aa8e 100644 --- a/slither/detectors/statements/msg_value_in_loop.py +++ b/slither/detectors/statements/msg_value_in_loop.py @@ -8,6 +8,9 @@ from slither.slithir.operations import InternalCall from slither.core.declarations import SolidityVariableComposed, Contract from slither.utils.output import Output +from slither.slithir.variables.constant import Constant +from slither.core.variables import Variable +from slither.core.expressions.literal import Literal def detect_msg_value_in_loop(contract: Contract) -> List[Node]: @@ -37,6 +40,21 @@ def msg_value_in_loop( for ir in node.all_slithir_operations(): if in_loop_counter > 0 and SolidityVariableComposed("msg.value") in ir.read: + # If we find a conditional expression with msg.value and is compared to 0 we don't report it + if ir.node.is_conditional() and SolidityVariableComposed("msg.value") in ir.read: + compared_to = ( + ir.read[1] + if ir.read[0] == SolidityVariableComposed("msg.value") + else ir.read[0] + ) + if ( + isinstance(compared_to, Constant) + and compared_to.value == 0 + or isinstance(compared_to, Variable) + and isinstance(compared_to.expression, Literal) + and str(compared_to.expression.value) == "0" + ): + continue results.append(ir.node) if isinstance(ir, (InternalCall)): msg_value_in_loop(ir.function.entry_point, in_loop_counter, visited, results) diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.4.25/msg_value_loop.sol b/tests/e2e/detectors/test_data/msg-value-loop/0.4.25/msg_value_loop.sol index a32b79d8dc..e0f35861af 100644 --- a/tests/e2e/detectors/test_data/msg-value-loop/0.4.25/msg_value_loop.sol +++ b/tests/e2e/detectors/test_data/msg-value-loop/0.4.25/msg_value_loop.sol @@ -26,4 +26,38 @@ contract C{ } } + function good1(address[] memory receivers) public payable { + require(msg.value == 0); + for (uint256 i = 0; i < receivers.length; i++) { + balances[receivers[i]] += 1; + } + } + + function good2(address[] memory receivers) public payable { + uint zero = 0; + for (uint256 i = 0; i < receivers.length; i++) { + assert(msg.value == zero); + balances[receivers[i]] += 1; + } + } + + function good3(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + if (0 != msg.value) { + revert(); + } + balances[receivers[i]] += 1; + } + } + + function good4(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + _g(); + balances[receivers[i]] += 1; + } + } + + function _g() internal { + require(msg.value == 0); + } } \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.4.25/msg_value_loop.sol-0.4.25.zip b/tests/e2e/detectors/test_data/msg-value-loop/0.4.25/msg_value_loop.sol-0.4.25.zip index 377d24cfd8e038962a045fae95fadf5d88d0da35..afa475f85458e82bcb379a3d671b7cec422a053d 100644 GIT binary patch delta 5683 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 Zu&Pk$1{DAR2_ylNgbhgsEfxR(002`4=g|NF delta 3421 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 diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.5.16/msg_value_loop.sol b/tests/e2e/detectors/test_data/msg-value-loop/0.5.16/msg_value_loop.sol index a32b79d8dc..e0f35861af 100644 --- a/tests/e2e/detectors/test_data/msg-value-loop/0.5.16/msg_value_loop.sol +++ b/tests/e2e/detectors/test_data/msg-value-loop/0.5.16/msg_value_loop.sol @@ -26,4 +26,38 @@ contract C{ } } + function good1(address[] memory receivers) public payable { + require(msg.value == 0); + for (uint256 i = 0; i < receivers.length; i++) { + balances[receivers[i]] += 1; + } + } + + function good2(address[] memory receivers) public payable { + uint zero = 0; + for (uint256 i = 0; i < receivers.length; i++) { + assert(msg.value == zero); + balances[receivers[i]] += 1; + } + } + + function good3(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + if (0 != msg.value) { + revert(); + } + balances[receivers[i]] += 1; + } + } + + function good4(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + _g(); + balances[receivers[i]] += 1; + } + } + + function _g() internal { + require(msg.value == 0); + } } \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.5.16/msg_value_loop.sol-0.5.16.zip b/tests/e2e/detectors/test_data/msg-value-loop/0.5.16/msg_value_loop.sol-0.5.16.zip index e6082623ef1d01beac56c51a38b7ec847d548e51..2089eb4335bc830c98042941fe71c920fdd39c1e 100644 GIT binary patch delta 6095 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 Vf)@Y)qc{PRs}4y9#uoqp000VCvAh5P delta 3724 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 diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.6.11/msg_value_loop.sol b/tests/e2e/detectors/test_data/msg-value-loop/0.6.11/msg_value_loop.sol index a32b79d8dc..e0f35861af 100644 --- a/tests/e2e/detectors/test_data/msg-value-loop/0.6.11/msg_value_loop.sol +++ b/tests/e2e/detectors/test_data/msg-value-loop/0.6.11/msg_value_loop.sol @@ -26,4 +26,38 @@ contract C{ } } + function good1(address[] memory receivers) public payable { + require(msg.value == 0); + for (uint256 i = 0; i < receivers.length; i++) { + balances[receivers[i]] += 1; + } + } + + function good2(address[] memory receivers) public payable { + uint zero = 0; + for (uint256 i = 0; i < receivers.length; i++) { + assert(msg.value == zero); + balances[receivers[i]] += 1; + } + } + + function good3(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + if (0 != msg.value) { + revert(); + } + balances[receivers[i]] += 1; + } + } + + function good4(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + _g(); + balances[receivers[i]] += 1; + } + } + + function _g() internal { + require(msg.value == 0); + } } \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.6.11/msg_value_loop.sol-0.6.11.zip b/tests/e2e/detectors/test_data/msg-value-loop/0.6.11/msg_value_loop.sol-0.6.11.zip index 2aeae50e8626a70381e92b464f7c3c47624222cc..fe0c5241cb7f1297768685d9e80575b9194acf54 100644 GIT binary patch delta 5881 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 H00000;gPXE diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.8.0/msg_value_loop.sol b/tests/e2e/detectors/test_data/msg-value-loop/0.8.0/msg_value_loop.sol index a32b79d8dc..e0f35861af 100644 --- a/tests/e2e/detectors/test_data/msg-value-loop/0.8.0/msg_value_loop.sol +++ b/tests/e2e/detectors/test_data/msg-value-loop/0.8.0/msg_value_loop.sol @@ -26,4 +26,38 @@ contract C{ } } + function good1(address[] memory receivers) public payable { + require(msg.value == 0); + for (uint256 i = 0; i < receivers.length; i++) { + balances[receivers[i]] += 1; + } + } + + function good2(address[] memory receivers) public payable { + uint zero = 0; + for (uint256 i = 0; i < receivers.length; i++) { + assert(msg.value == zero); + balances[receivers[i]] += 1; + } + } + + function good3(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + if (0 != msg.value) { + revert(); + } + balances[receivers[i]] += 1; + } + } + + function good4(address[] memory receivers) public payable { + for (uint256 i = 0; i < receivers.length; i++) { + _g(); + balances[receivers[i]] += 1; + } + } + + function _g() internal { + require(msg.value == 0); + } } \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/msg-value-loop/0.8.0/msg_value_loop.sol-0.8.0.zip b/tests/e2e/detectors/test_data/msg-value-loop/0.8.0/msg_value_loop.sol-0.8.0.zip index 13d17a8aa06963b37222efbc6472a2c40d44a7cf..5eb9b1fceb1fc04c8e81864c96dd811480379f89 100644 GIT binary patch delta 6762 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 M5lIGI8UO$Q0K%~x$p8QV delta 4538 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