Security analysis tool for EVM bytecode. Supports smart contracts built for Ethereum, Hedera, Quorum, Vechain, Roostock, Tron and other EVM-compatible blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mythril/tests/laser/state/calldata_test.py

92 lines
1.9 KiB

6 years ago
import pytest
from mythril.laser.ethereum.state.calldata import ConcreteCalldata, SymbolicCalldata
from mythril.laser.smt import Solver, symbol_factory
from z3 import sat, unsat
6 years ago
from z3.z3types import Z3Exception
from mock import MagicMock
6 years ago
uninitialized_test_data = [
([]), # Empty concrete calldata
([1, 4, 5, 3, 4, 72, 230, 53]), # Concrete calldata
6 years ago
]
6 years ago
@pytest.mark.parametrize("starting_calldata", uninitialized_test_data)
def test_concrete_calldata_uninitialized_index(starting_calldata):
6 years ago
# Arrange
calldata = ConcreteCalldata(0, starting_calldata)
6 years ago
# Act
value = calldata[100]
value2 = calldata.get_word_at(200)
6 years ago
# Assert
assert value == 0
assert value2 == 0
6 years ago
6 years ago
def test_concrete_calldata_calldatasize():
# Arrange
calldata = ConcreteCalldata(0, [1, 4, 7, 3, 7, 2, 9])
6 years ago
solver = Solver()
# Act
solver.check()
model = solver.model()
result = model.eval(calldata.calldatasize.raw)
6 years ago
# Assert
assert result == 7
def test_concrete_calldata_constrain_index():
# Arrange
calldata = ConcreteCalldata(0, [1, 4, 7, 3, 7, 2, 9])
6 years ago
solver = Solver()
# Act
value = calldata[2]
constraint = value == 3
6 years ago
solver.add(constraint)
6 years ago
result = solver.check()
# Assert
assert str(result) == "unsat"
def test_symbolic_calldata_constrain_index():
# Arrange
calldata = SymbolicCalldata(0)
solver = Solver()
# Act
value = calldata[51]
constraints = [value == 1, calldata.calldatasize == 50]
solver.add(*constraints)
result = solver.check()
# Assert
assert str(result) == "unsat"
def test_symbolic_calldata_equal_indices():
calldata = SymbolicCalldata(0)
index_a = symbol_factory.BitVecSym("index_a", 256)
index_b = symbol_factory.BitVecSym("index_b", 256)
# Act
a = calldata[index_a]
b = calldata[index_b]
s = Solver()
s.append(index_a == index_b)
s.append(a != b)
# Assert
assert unsat == s.check()