def to_z3_astCall(self, obj):
        func_name = SH.get_attribute_string(obj.func)
        if func_name == "min":
            val1 = self.to_z3(obj.args[0])
            val2 = self.to_z3(obj.args[1])
            test = val1 <= val2

            cs = ConstraintSet(self.all_constraints.copy(), z3.And(test))
            cs.set_label(f"min function at Line #{obj.lineno}")
            self.constraint_sets_to_check.append(cs)

            return super().to_z3_astCall(obj)

        if func_name == "max":
            val1 = self.to_z3(obj.args[0])
            val2 = self.to_z3(obj.args[1])
            test = val1 >= val2

            cs = ConstraintSet(self.all_constraints.copy(), z3.And(test))
            cs.set_label(f"Max function at Line #{obj.lineno}")
            self.constraint_sets_to_check.append(cs)

            return super().to_z3_astCall(obj)

        logger.error(
            "You will probably see wrong results, because the analysis does not work for function calls yet."
        )
        return super().to_z3_astCall(obj)
示例#2
0
    def to_z3_astAttribute(self, obj):
        full_attr_string = SH.get_attribute_string(obj)

        # ASSUMPTION: the format has a self-prefix and a value-suffix
        # e.g. self.port.value or self.entity.port.value
        attr_name = ".".join(full_attr_string.split(".")[1:-1])
        if full_attr_string.endswith(".pre"):
            attr_name += ".pre"
        return self.get_linearized_z3_var(obj, attr_name)
示例#3
0
    def resolve_type_Call(self, obj):
        func_name = SH.get_attribute_string(obj.func)

        if func_name == "abs":
            return self.resolve_type(obj.args[0])
        if func_name in ["min", "max"]:
            type1 = self.resolve_type(obj.args[0])
            type2 = self.resolve_type(obj.args[1])
            target_type = self.resolve_two_types(type1, type2)
            return target_type

        raise NotImplementedError(
            "This version of CREST does not yet resolving of types for function call statements."
        )
示例#4
0
def extract_assignments_with_name_on_left(name, siblings):
    assignments = list(
        filter(
            (lambda x: isinstance(x,
                                  (ast.Assign, ast.AugAssign, ast.AnnAssign))),
            siblings))
    assignments_variable_targets = [
        t for fa in assignments for t in SH.get_targets_from_assignment(fa)
        if isinstance(t, (ast.Name, ast.Attribute))
    ]
    with_matching_name = [
        var_target for var_target in assignments_variable_targets
        if SH.get_attribute_string(var_target) == name
    ]
    return with_matching_name
示例#5
0
    def to_z3_astCall(self, obj):
        func_name = SH.get_attribute_string(obj.func)
        if func_name in ["print"]:  # list of functions that we just ignore
            return None

        if func_name == "abs":
            val = self.to_z3(obj.args[0])
            return z3.If(val > 0, val, -1 * val)
        if func_name == "min":
            val1 = self.to_z3(obj.args[0])
            val2 = self.to_z3(obj.args[1])
            return z3.If(val1 <= val2, val1, val2)
        if func_name == "max":
            val1 = self.to_z3(obj.args[0])
            val2 = self.to_z3(obj.args[1])
            return z3.If(val1 >= val2, val1, val2)

        raise NotImplementedError(
            "This version of CREST does not yet support function call statements."
        )
示例#6
0
 def resolve_type_AnnAssign(self, obj):
     return eval(SH.get_attribute_string(obj.annotation))