예제 #1
0
    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)
예제 #2
0
    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)
예제 #4
0
 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)
예제 #6
0
 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))
예제 #7
0
 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))