mirror of https://github.com/crytic/slither
Merge pull request #1762 from crytic/fix-new-contract-reads
include salt in NewContract op, add test infrapull/1770/head
commit
8a01247fa5
@ -0,0 +1,17 @@ |
|||||||
|
|
||||||
|
contract Placeholder { |
||||||
|
constructor() payable {} |
||||||
|
} |
||||||
|
|
||||||
|
contract NewContract { |
||||||
|
bytes32 internal constant state_variable_read = bytes32(0); |
||||||
|
|
||||||
|
function readAllStateVariables() external { |
||||||
|
new Placeholder{salt: state_variable_read} (); |
||||||
|
} |
||||||
|
|
||||||
|
function readAllLocalVariables() external { |
||||||
|
bytes32 local_variable_read = bytes32(0); |
||||||
|
new Placeholder{salt: local_variable_read} (); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
from collections import namedtuple |
||||||
|
from slither import Slither |
||||||
|
from slither.slithir.operations import Operation, NewContract |
||||||
|
|
||||||
|
|
||||||
|
def check_num_local_vars_read(function, slithir_op: Operation, num_reads_expected: int): |
||||||
|
for node in function.nodes: |
||||||
|
for operation in node.irs: |
||||||
|
if isinstance(operation, slithir_op): |
||||||
|
assert len(operation.read) == num_reads_expected |
||||||
|
assert len(node.local_variables_read) == num_reads_expected |
||||||
|
|
||||||
|
|
||||||
|
def check_num_states_vars_read(function, slithir_op: Operation, num_reads_expected: int): |
||||||
|
for node in function.nodes: |
||||||
|
for operation in node.irs: |
||||||
|
if isinstance(operation, slithir_op): |
||||||
|
assert len(operation.read) == num_reads_expected |
||||||
|
assert len(node.state_variables_read) == num_reads_expected |
||||||
|
|
||||||
|
|
||||||
|
OperationTest = namedtuple("OperationTest", "contract_name slithir_op") |
||||||
|
|
||||||
|
OPERATION_TEST = [OperationTest("NewContract", NewContract)] |
||||||
|
|
||||||
|
|
||||||
|
def test_operation_reads() -> None: |
||||||
|
""" |
||||||
|
Every slithir operation has its own contract and reads all local and state variables in readAllLocalVariables and readAllStateVariables, respectively. |
||||||
|
""" |
||||||
|
slither = Slither("./tests/slithir/operation_reads.sol") |
||||||
|
|
||||||
|
for op_test in OPERATION_TEST: |
||||||
|
print(op_test) |
||||||
|
available = slither.get_contract_from_name(op_test.contract_name) |
||||||
|
assert len(available) == 1 |
||||||
|
target = available[0] |
||||||
|
|
||||||
|
num_state_variables = len(target.state_variables_ordered) |
||||||
|
state_function = target.get_function_from_signature("readAllStateVariables()") |
||||||
|
check_num_states_vars_read(state_function, op_test.slithir_op, num_state_variables) |
||||||
|
|
||||||
|
local_function = target.get_function_from_signature("readAllLocalVariables()") |
||||||
|
num_local_vars = len(local_function.local_variables) |
||||||
|
check_num_local_vars_read(local_function, op_test.slithir_op, num_local_vars) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
test_operation_reads() |
Loading…
Reference in new issue