def lhs_ast( self, astree: AbstractSyntaxTree, iaddr: str, xdata: InstrXData) -> Tuple[ASTLval, List[ASTInstruction]]: def indirect_lhs( rtype: Optional[BCTyp]) -> Tuple[ASTLval, List[ASTInstruction]]: tmplval = astree.mk_returnval_variable_lval(iaddr, rtype) tmprhs = astree.mk_lval_expr(tmplval) reglval = astree.mk_register_variable_lval("v0") return (tmplval, [astree.mk_assign(reglval, tmprhs)]) calltarget = xdata.call_target(self.ixd) tgtname = calltarget.name models = ModelsAccess() if astree.has_symbol(tgtname) and astree.symbol(tgtname).vtype: fnsymbol = astree.symbol(tgtname) if fnsymbol.returns_void: return (astree.mk_ignored_lval(), []) elif astree.ignore_return_value(tgtname): return (astree.mk_ignored_lval(), []) else: return indirect_lhs(fnsymbol.vtype) elif models.has_so_function_summary(tgtname): summary = models.so_function_summary(tgtname) returntype = summary.signature.returntype if returntype.is_named_type: returntype = cast(MNamedType, returntype) typename = returntype.typename if typename == "void" or typename == "VOID": return (astree.mk_ignored_lval(), []) elif astree.ignore_return_value(tgtname): return (astree.mk_ignored_lval(), []) else: return indirect_lhs(None) elif astree.ignore_return_value(tgtname): return (astree.mk_ignored_lval(), []) else: return indirect_lhs(None) else: return indirect_lhs(None)
def annotation(self, xdata: InstrXData) -> str: """data format: a:<v0><args><call-target-ix> , or a:<v0> xprs[0]: value of v0 xprs[1...]: arguments xprs[-1]: index of call target in interface dictionary """ if xdata.has_call_target(): pargs = "(" + ", ".join(str(a) for a in self.arguments(xdata)) + ")" return str(xdata.call_target(self.ixd)) + pargs else: rhs = str(xdata.xprs[0]) if rhs.startswith("0x"): syscallnumber = int(rhs, 16) syscallfunction = SC.get_mips_linux_syscall(syscallnumber) return "linux-systemcall:" + syscallfunction else: return "linux-systemcall(" + rhs + ")"
def annotation(self, xdata: InstrXData) -> str: """data format: a:xx... + c direct call / resolved indirect call: xprs[0..] arguments calltarget unresolved indirect call: xprs[0] target expression xprs[1] target expression (simplified) xprs[2...] arguments """ if xdata.has_indirect_call_target_exprs(): tgtx = xdata.xprs[1] callargs = xdata.xprs[2:] return str(tgtx) + "(" + ",".join([str(x) for x in callargs]) + ")" elif xdata.has_call_target(): ctgt = xdata.call_target(self.ixd) callargs = xdata.xprs return str(ctgt) + "(" + ",".join([str(x) for x in callargs]) + ")" else: return "call to " + str(self.tgtoperand)
def call_target(self, xdata: InstrXData) -> "CallTarget": if self.is_call(xdata): return xdata.call_target(self.ixd) else: raise UF.CHBError("Instruction is not a call: " + str(self))
def call_target(self, xdata: InstrXData) -> CallTarget: return xdata.call_target(self.ixd)
def call_target(self, xdata: InstrXData) -> "CallTarget": if xdata.has_call_target(): return xdata.call_target(self.ixd) else: raise UF.CHBError("Instruction does not have a call target: " + str(self))
def call_target(self, xdata: InstrXData) -> "CallTarget": if xdata.has_call_target(): return xdata.call_target(self.ixd) else: raise UF.CHBError("Call target not found for " + str(self))