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/strategy/beam_test.py

109 lines
3.1 KiB

import pytest
from mythril.laser.ethereum.strategy.beam import (
BeamSearch,
)
from mythril.disassembler.disassembly import Disassembly
from mythril.laser.ethereum.state.environment import Environment
from mythril.laser.ethereum.state.machine_state import MachineState
from mythril.laser.ethereum.state.global_state import GlobalState
from mythril.laser.ethereum.state.world_state import WorldState
from mythril.analysis.potential_issues import PotentialIssuesAnnotation
world_state = WorldState()
account = world_state.create_account(balance=10, address=101)
account.code = Disassembly("60606040")
environment = Environment(account, None, None, None, None, None, None)
potential_issues = PotentialIssuesAnnotation()
# It is a hassle to construct multiple issues
potential_issues.potential_issues = [0, 0]
@pytest.mark.parametrize(
"state, priority",
[
(
GlobalState(
world_state,
environment,
None,
MachineState(gas_limit=8000000),
annotations=[PotentialIssuesAnnotation()],
),
0,
),
(
GlobalState(
world_state,
environment,
None,
MachineState(gas_limit=8000000),
annotations=[potential_issues],
),
20,
),
],
)
def test_priority_sum(state, priority):
assert priority == BeamSearch.beam_priority(state)
@pytest.mark.parametrize(
"states, width",
[
(
[
GlobalState(
world_state,
environment,
None,
MachineState(gas_limit=8000000),
annotations=[PotentialIssuesAnnotation()],
),
GlobalState(
world_state,
environment,
None,
MachineState(gas_limit=8000000),
annotations=[potential_issues],
),
],
1,
),
(
100
* [
GlobalState(
world_state,
environment,
None,
MachineState(gas_limit=8000000),
annotations=[PotentialIssuesAnnotation()],
)
],
1,
),
(
100
* [
GlobalState(
world_state,
environment,
None,
MachineState(gas_limit=8000000),
annotations=[PotentialIssuesAnnotation()],
)
],
0,
),
],
)
def test_elimination(states, width):
strategy = BeamSearch(states, max_depth=100, beam_width=width)
strategy.sort_and_eliminate_states()
assert len(strategy.work_list) <= width
for i in range(len(strategy.work_list) - 1):
assert strategy.beam_priority(strategy.work_list[i]) >= strategy.beam_priority(
strategy.work_list[i + 1]
)