mirror of https://github.com/ConsenSys/mythril
blockchainethereumsmart-contractssoliditysecurityprogram-analysissecurity-analysissymbolic-execution
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.
109 lines
3.1 KiB
109 lines
3.1 KiB
3 years ago
|
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]
|
||
|
)
|