mirror of https://github.com/ConsenSys/mythril
Only propagate code based call annotations (#1211)
* Only propagate code based call annotations * Move the if condition to a better placecheck-delegatecall-after
parent
b265254055
commit
5f424b62d9
@ -0,0 +1,65 @@ |
|||||||
|
from mythril.laser.ethereum.state.annotation import StateAnnotation |
||||||
|
|
||||||
|
from copy import copy |
||||||
|
from typing import Dict, List, Set |
||||||
|
|
||||||
|
|
||||||
|
class MutationAnnotation(StateAnnotation): |
||||||
|
"""Mutation Annotation |
||||||
|
|
||||||
|
This is the annotation used by the MutationPruner plugin to record mutations |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
class DependencyAnnotation(StateAnnotation): |
||||||
|
"""Dependency Annotation |
||||||
|
|
||||||
|
This annotation tracks read and write access to the state during each transaction. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
self.storage_loaded = [] # type: List |
||||||
|
self.storage_written = {} # type: Dict[int, List] |
||||||
|
self.has_call = False # type: bool |
||||||
|
self.path = [0] # type: List |
||||||
|
self.blocks_seen = set() # type: Set[int] |
||||||
|
|
||||||
|
def __copy__(self): |
||||||
|
result = DependencyAnnotation() |
||||||
|
result.storage_loaded = copy(self.storage_loaded) |
||||||
|
result.storage_written = copy(self.storage_written) |
||||||
|
result.has_call = self.has_call |
||||||
|
result.path = copy(self.path) |
||||||
|
result.blocks_seen = copy(self.blocks_seen) |
||||||
|
return result |
||||||
|
|
||||||
|
def get_storage_write_cache(self, iteration: int): |
||||||
|
if iteration not in self.storage_written: |
||||||
|
self.storage_written[iteration] = [] |
||||||
|
|
||||||
|
return self.storage_written[iteration] |
||||||
|
|
||||||
|
def extend_storage_write_cache(self, iteration: int, value: object): |
||||||
|
if iteration not in self.storage_written: |
||||||
|
self.storage_written[iteration] = [value] |
||||||
|
elif value not in self.storage_written[iteration]: |
||||||
|
self.storage_written[iteration].append(value) |
||||||
|
|
||||||
|
|
||||||
|
class WSDependencyAnnotation(StateAnnotation): |
||||||
|
"""Dependency Annotation for World state |
||||||
|
|
||||||
|
This world state annotation maintains a stack of state annotations. |
||||||
|
It is used to transfer individual state annotations from one transaction to the next. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
self.annotations_stack = [] |
||||||
|
|
||||||
|
def __copy__(self): |
||||||
|
result = WSDependencyAnnotation() |
||||||
|
result.annotations_stack = copy(self.annotations_stack) |
||||||
|
return result |
Loading…
Reference in new issue