From 7881f7c2308f7ab3bcbbff233b3515d5db5fd919 Mon Sep 17 00:00:00 2001 From: Simone Date: Fri, 11 Aug 2023 18:26:37 +0200 Subject: [PATCH 1/2] Fix for nested mappings --- .../detectors/statements/mapping_deletion.py | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/slither/detectors/statements/mapping_deletion.py b/slither/detectors/statements/mapping_deletion.py index 4cdac72400..0940d5a07b 100644 --- a/slither/detectors/statements/mapping_deletion.py +++ b/slither/detectors/statements/mapping_deletion.py @@ -6,6 +6,7 @@ from slither.core.cfg.node import Node from slither.core.declarations import Structure from slither.core.declarations.contract import Contract +from slither.core.variables.variable import Variable from slither.core.declarations.function_contract import FunctionContract from slither.core.solidity_types import MappingType, UserDefinedType from slither.detectors.abstract_detector import ( @@ -69,14 +70,25 @@ def detect_mapping_deletion( for ir in node.irs: if isinstance(ir, Delete): value = ir.variable - if isinstance(value.type, UserDefinedType) and isinstance( - value.type.type, Structure - ): - st = value.type.type - if any(isinstance(e.type, MappingType) for e in st.elems.values()): - ret.append((f, st, node)) + MappingDeletionDetection.check_if_mapping(value, ret, f, node) + return ret + @staticmethod + def check_if_mapping( + value: Variable, + ret: List[Tuple[FunctionContract, Structure, Node]], + f: FunctionContract, + node: Node, + ): + if isinstance(value.type, UserDefinedType) and isinstance(value.type.type, Structure): + st = value.type.type + if any(isinstance(e.type, MappingType) for e in st.elems.values()): + ret.append((f, st, node)) + return + for e in st.elems.values(): + MappingDeletionDetection.check_if_mapping(e, ret, f, node) + def _detect(self) -> List[Output]: """Detect mapping deletion From 2c196a155113de1b3e435800557361c739c863f2 Mon Sep 17 00:00:00 2001 From: Simone Date: Fri, 8 Sep 2023 10:40:17 +0200 Subject: [PATCH 2/2] Add test --- ...etection_0_4_25_MappingDeletion_sol__0.txt | 7 +++++-- ...etection_0_5_16_MappingDeletion_sol__0.txt | 7 +++++-- ...etection_0_6_11_MappingDeletion_sol__0.txt | 7 +++++-- ...Detection_0_7_6_MappingDeletion_sol__0.txt | 7 +++++-- .../0.4.25/MappingDeletion.sol | 19 ++++++++++++++---- .../0.4.25/MappingDeletion.sol-0.4.25.zip | Bin 4451 -> 4826 bytes .../0.5.16/MappingDeletion.sol | 12 ++++++++++- .../0.5.16/MappingDeletion.sol-0.5.16.zip | Bin 4490 -> 4854 bytes .../0.6.11/MappingDeletion.sol | 12 ++++++++++- .../0.6.11/MappingDeletion.sol-0.6.11.zip | Bin 4462 -> 4829 bytes .../0.7.6/MappingDeletion.sol | 12 ++++++++++- .../0.7.6/MappingDeletion.sol-0.7.6.zip | Bin 4359 -> 4728 bytes 12 files changed, 68 insertions(+), 15 deletions(-) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt index 902f966688..4d47bb5709 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#41) + Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#10) -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#28-31) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#30) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#37) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt index fec236e1c2..88e4ac554f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#10) -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#31) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#37) + +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#41) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt index 7f0372c36d..4270f0d86c 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#31) +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#41) Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#10) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#37) + diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt index f519a046f1..ea6ed2dd6a 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt @@ -1,5 +1,8 @@ -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#31) +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#41) + +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#37) Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#10) diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol index bedbb64a8f..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol @@ -6,7 +6,7 @@ library Lib{ mapping(address => uint) maps; } - function deleteSt(MyStruct[1] storage st){ + function deleteSt(MyStruct[1] storage st) internal { delete st[0]; } @@ -17,18 +17,29 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { - require(stackBalance[idx].owner == 0); - stackBalance[idx] = BalancesStruct(msg.sender); + require(stackBalance[idx].owner == address(0)); + BalancesStruct storage str = stackBalance[idx]; + str.owner = msg.sender; } function deleteBalance(uint idx) public { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol-0.4.25.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol-0.4.25.zip index be3e13807a58aa1af11fdb342f340adc88a9755d..58859369959bfac936960954f215b5833a09526f 100644 GIT binary patch delta 4714 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 diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol index e1b608a463..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol @@ -17,9 +17,15 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol-0.5.16.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol-0.5.16.zip index 0ad84a58895f5b258c6da9782c5af54a4c8a90c0..2e578904619f0599c1f10815a5902848ac7061d6 100644 GIT binary patch delta 4742 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 l00XK304D$d00000000000Du7i0001!xe_-99}xfm005XpUMm0q diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol index e1b608a463..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol @@ -17,9 +17,15 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol-0.6.11.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol-0.6.11.zip index 5f66da061726c113304482f713b820a2633b3af7..8f532ea669ffceb1de40fa487ffbac2520a01042 100644 GIT binary patch delta 4724 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 uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol-0.7.6.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol-0.7.6.zip index 5888e0e534de961f401d61096c979e183b926d78..c685454ce649c797088054d6913880ef784de64a 100644 GIT binary patch delta 4615 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 delta 4267 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