Static Analyzer for Solidity
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.
slither/tests/unit/slithir/test_argument_reorder.py

66 lines
2.3 KiB

from pathlib import Path
from slither import Slither
from slither.slithir.operations.internal_call import InternalCall
from slither.slithir.operations.new_structure import NewStructure
from slither.slithir.variables.constant import Constant
TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data"
ARG_REORDER_TEST_ROOT = Path(TEST_DATA_DIR, "argument_reorder")
def test_struct_constructor_reorder(solc_binary_path) -> None:
solc_path = solc_binary_path("0.8.15")
slither = Slither(
Path(ARG_REORDER_TEST_ROOT, "test_struct_constructor.sol").as_posix(), solc=solc_path
)
operations = slither.contracts[0].functions[0].slithir_operations
constructor_calls = [x for x in operations if isinstance(x, NewStructure)]
assert len(constructor_calls) == 2
# Arguments to first call are 2, 3
assert (
isinstance(constructor_calls[0].arguments[0], Constant)
and constructor_calls[0].arguments[0].value == 2
)
assert (
isinstance(constructor_calls[0].arguments[1], Constant)
and constructor_calls[0].arguments[1].value == 3
)
# Arguments to second call are 5, 4 (note the reversed order)
assert (
isinstance(constructor_calls[1].arguments[0], Constant)
and constructor_calls[1].arguments[0].value == 5
)
assert (
isinstance(constructor_calls[1].arguments[1], Constant)
and constructor_calls[1].arguments[1].value == 4
)
def test_internal_call_reorder(solc_binary_path) -> None:
solc_path = solc_binary_path("0.8.15")
slither = Slither(
Path(ARG_REORDER_TEST_ROOT, "test_internal_call_reorder.sol").as_posix(), solc=solc_path
)
operations = slither.contracts[0].functions[1].slithir_operations
internal_calls = [x for x in operations if isinstance(x, InternalCall)]
assert len(internal_calls) == 1
# Arguments to call are 3, true, 5
assert (
isinstance(internal_calls[0].arguments[0], Constant)
and internal_calls[0].arguments[0].value == 3
)
assert (
isinstance(internal_calls[0].arguments[1], Constant)
and internal_calls[0].arguments[1].value is True
)
assert (
isinstance(internal_calls[0].arguments[2], Constant)
and internal_calls[0].arguments[2].value == 5
)