mirror of https://github.com/ConsenSys/mythril
parent
a89461228e
commit
509fc35fcb
@ -0,0 +1,43 @@ |
||||
from mythril.laser.smt.bitvec import BitVec |
||||
import z3 |
||||
|
||||
|
||||
class BaseArray: |
||||
""" |
||||
Base array type, implements basic store and set operations |
||||
""" |
||||
def __getitem__(self, item: BitVec): |
||||
""" Gets item from the array, item can be symbolic""" |
||||
if isinstance(item, slice): |
||||
raise ValueError("Instance of BaseArray, does not support getitem with slices") |
||||
return z3.Select(self.raw, item.raw) |
||||
|
||||
def __setitem__(self, key: BitVec, value: BitVec): |
||||
""" Sets an item in the array, key can be symbolic""" |
||||
self.raw = z3.Store(self.raw, key, value) |
||||
|
||||
|
||||
class Array(BaseArray): |
||||
def __init__(self, name: str, domain: int, value_range: int): |
||||
""" |
||||
Initializes a symbolic array |
||||
:param name: Name of the array |
||||
:param domain: The domain for the array (10 -> all the values that a bv of size 10 could take) |
||||
:param range: The range for the values in the array (10 -> all the values that a bv of size 10 could take) |
||||
""" |
||||
self.domain = z3.BitVecSort(domain) |
||||
self.range = z3.BitVecSort(value_range) |
||||
self.raw = z3.Array(name, self.domain, self.range) |
||||
|
||||
|
||||
class K(BaseArray): |
||||
def __init__(self, domain: int, value_range: int, value: int): |
||||
""" |
||||
Initializes an array with a default value |
||||
:param domain: The domain for the array (10 -> all the values that a bv of size 10 could take) |
||||
:param value_range: The range for the values in the array (10 -> all the values that a bv of size 10 could take) |
||||
:param value: The default value to use for this array |
||||
""" |
||||
self.domain = z3.BitVecSort(domain) |
||||
self.value = z3.BitVecVal(value, value_range) |
||||
self.raw = z3.K(self.domain, self.value) |
Loading…
Reference in new issue