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)
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)
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." )
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
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." )
def resolve_type_AnnAssign(self, obj): return eval(SH.get_attribute_string(obj.annotation))