import pytest from mythril.laser.ethereum.state import Calldata from z3 import Solver, simplify from z3.z3types import Z3Exception uninitialized_test_data = [ ([]), # Empty concrete calldata ([1,4,5,3,4,72,230,53]) # Concrete calldata ] @pytest.mark.parametrize("starting_calldata", uninitialized_test_data) def test_concrete_calldata_uninitialized_index(starting_calldata): # Arrange calldata = Calldata(0, starting_calldata) solver = Solver() # Act value = calldata[100] value2 = calldata.get_word_at(200) solver.add(calldata.constraints) solver.check() model = solver.model() value = model.eval(value) value2 = model.eval(value2) # Assert assert value == 0 assert value2 == 0 def test_concrete_calldata_calldatasize(): # Arrange calldata = Calldata(0, [1,4,7,3,7,2,9]) solver = Solver() # Act solver.add(calldata.constraints) solver.check() model = solver.model() result = model.eval(calldata.calldatasize) # Assert assert result == 7 def test_symbolic_calldata_constrain_index(): # Arrange calldata = Calldata(0) solver = Solver() # Act constraint = calldata[100] == 50 value = calldata[100] solver.add(calldata.constraints + [constraint]) solver.check() model = solver.model() value = model.eval(value) calldatasize = model.eval(calldata.calldatasize) # Assert assert value == 50 assert simplify(calldatasize >= 100) def test_concrete_calldata_constrain_index(): # Arrange calldata = Calldata(0, [1,4,7,3,7,2,9]) solver = Solver() # Act constraint = calldata[2] == 3 solver.add(calldata.constraints + [constraint]) result = solver.check() # Assert assert str(result) == 'unsat' def test_concrete_calldata_constrain_index(): # Arrange calldata = Calldata(0) solver = Solver() # Act constraints = [] constraints.append(calldata[51] == 1) constraints.append(calldata.calldatasize == 50) solver.add(calldata.constraints + constraints) result = solver.check() # Assert assert str(result) == 'unsat'