Implements array type

pull/813/head
Joran Honig 6 years ago
parent a89461228e
commit 509fc35fcb
  1. 43
      mythril/laser/smt/array.py
  2. 0
      mythril/laser/smt/solver.py

@ -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…
Cancel
Save