diff --git a/evm_cfg_builder/value_analysis/value_set_analysis.py b/evm_cfg_builder/value_analysis/value_set_analysis.py index 1617c18..cb992ab 100644 --- a/evm_cfg_builder/value_analysis/value_set_analysis.py +++ b/evm_cfg_builder/value_analysis/value_set_analysis.py @@ -343,26 +343,19 @@ def merge_stack(stacks: List[Stack], authorized_values): _max_number_of_elements = len(authorized_values) if authorized_values else 100 - found = True - i = 0 - while found: - vals: Optional[Set[int]] = set() - found = False - for stack in stacks: - elems = stack.get_elems() - if len(elems) <= i: - continue - found = True - next_vals = elems[i].get_vals() + for stack in stacks: + stack_elems = stack.get_elems() + for item in stack_elems: + vals = set() + next_vals = item.get_vals() if next_vals is None: vals = None break + vals |= next_vals - if len(vals) > _max_number_of_elements: - vals = None - break - stack_elements.append(AbsStackElem(authorized_values, vals)) - i = i + 1 + if len(stack_elements) < _max_number_of_elements: + stack_elements.append(AbsStackElem(authorized_values, vals)) + newSt = Stack(authorized_values) newSt.set_elems(stack_elements) return newSt diff --git a/tests/function_modifiers.evm b/tests/function_modifiers.evm new file mode 100644 index 0000000..6d2c82a Binary files /dev/null and b/tests/function_modifiers.evm differ diff --git a/tests/function_modifiers.sol b/tests/function_modifiers.sol new file mode 100644 index 0000000..833bac2 --- /dev/null +++ b/tests/function_modifiers.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; + +contract Something { + address public owner; + uint blockNumber = 1337; + constructor() { + owner = msg.sender; + } + + function a() public view returns (uint) { + return 1; + } + + function b() public pure returns (uint) { + return 2; + } + + function c() external pure returns (uint) { + return 3; + } + + function d() internal pure returns (uint) { + return 4; + } + + function e() private pure returns (uint) { + return 5; + } + + function f() internal returns (uint) { + return 6; + } + + function z() public payable returns (uint) { + d(); + e(); + return 6; + } +}