Source code for mythril.laser.smt.function

from typing import cast, List, Any, Set
import z3

from mythril.laser.smt.bitvec import BitVec


[docs]class Function: """An uninterpreted function.""" def __init__(self, name: str, domain: List[int], value_range: int): """Initializes an uninterpreted function. :param name: Name of the Function :param domain: The domain for the Function (10 -> all the values that a bv of size 10 could take) :param value_range: The range for the values of the function (10 -> all the values that a bv of size 10 could take) """ self.domain = [] for element in domain: self.domain.append(z3.BitVecSort(element)) self.range = z3.BitVecSort(value_range) self.raw = z3.Function(name, *self.domain, self.range) def __call__(self, *items) -> BitVec: """Function accessor, item can be symbolic.""" annotations: Set[Any] = set().union(*[item.annotations for item in items]) return BitVec( cast(z3.BitVecRef, self.raw(*[item.raw for item in items])), annotations=annotations, )