(self, addr, args, continue_at, cc=None, prototype=None)
Add an exit representing calling another function via pointer.

        :param addr:        The address of the function to call
        :param args:        The list of arguments to call the function with
        :param continue_at: Later, when the called function returns, execution of the current
                            procedure will continue in the named method.
        :param cc:          Optional: use this calling convention for calling the new function.
                            Default is to use the current convention.
        :param prototype:     Optional: The prototype to use for the call. Will default to all-ints.
Add an exit representing calling another function via pointer.
Add an exit representing calling another function via pointer .
def call(self, addr, args, continue_at, cc=None, prototype=None):
        """
        Add an exit representing calling another function via pointer.

        :param addr:        The address of the function to call
        :param args:        The list of arguments to call the function with
        :param continue_at: Later, when the called function returns, execution of the current
                            procedure will continue in the named method.
        :param cc:          Optional: use this calling convention for calling the new function.
                            Default is to use the current convention.
        :param prototype:     Optional: The prototype to use for the call. Will default to all-ints.
        """
        self.inhibit_autoret = True

        if cc is None:
            cc = self.cc
        prototype = cc.guess_prototype(args, prototype)

        call_state = self.state.copy()
        ret_addr = self.make_continuation(continue_at)
        saved_local_vars = list(zip(self.local_vars, map(lambda name: getattr(self, name), self.local_vars)))
        simcallstack_entry = (self.state.regs.sp if hasattr(self.state.regs, "sp") else None,
                              self.arguments,
                              saved_local_vars,
                              self.state.regs.lr if self.state.arch.lr_offset is not None else None,
                              ret_addr)
        cc.setup_callsite(call_state, ret_addr, args, prototype)
        call_state.callstack.top.procedure_data = simcallstack_entry

        # TODO: Move this to setup_callsite?
        if isinstance(call_state.addr, SootAddressDescriptor):
            pass
        elif call_state.libc.ppc64_abiv == 'ppc64_1':
            call_state.regs.r2 = self.state.mem[addr + 8:].long.resolved
            addr = call_state.mem[addr:].long.resolved
        elif call_state.arch.name in ('MIPS32', 'MIPS64'):
            call_state.regs.t9 = addr

        self._exit_action(call_state, addr)
        self.successors.add_successor(call_state, addr, call_state.solver.true, 'Ijk_Call')

        if o.DO_RET_EMULATION in self.state.options:
            # we need to set up the call because the continuation will try to tear it down
            ret_state = self.state.copy()
            cc.setup_callsite(ret_state, ret_addr, args, prototype)
            ret_state.callstack.top.procedure_data = simcallstack_entry
            guard = ret_state.solver.true if o.TRUE_RET_EMULATION_GUARD in ret_state.options else ret_state.solver.false
            self.successors.add_successor(ret_state, ret_addr, guard, 'Ijk_FakeRet')
def call ( self , addr , args , continue_at , cc = None , prototype = None ) : self . inhibit_autoret = True if cc is None : cc = self . cc prototype = cc . guess_prototype ( args , prototype ) call_state = self . state . copy ( ) ret_addr = self . make_continuation ( continue_at ) saved_local_vars = list ( zip ( self . local_vars , map ( lambda name : getattr ( self , name ) , self . local_vars ) ) ) simcallstack_entry = ( self . state . regs . sp if hasattr ( self . state . regs , "sp" ) else None , self . arguments , saved_local_vars , self . state . regs . lr if self . state . arch . lr_offset is not None else None , ret_addr ) cc . setup_callsite ( call_state , ret_addr , args , prototype ) call_state . callstack . top . procedure_data = simcallstack_entry # TODO: Move this to setup_callsite? if isinstance ( call_state . addr , SootAddressDescriptor ) : pass elif call_state . libc . ppc64_abiv == 'ppc64_1' : call_state . regs . r2 = self . state . mem [ addr + 8 : ] . long . resolved addr = call_state . mem [ addr : ] . long . resolved elif call_state . arch . name in ( 'MIPS32' , 'MIPS64' ) : call_state . regs . t9 = addr self . _exit_action ( call_state , addr ) self . successors . add_successor ( call_state , addr , call_state . solver . true , 'Ijk_Call' ) if o . DO_RET_EMULATION in self . state . options : # we need to set up the call because the continuation will try to tear it down ret_state = self . state . copy ( ) cc . setup_callsite ( ret_state , ret_addr , args , prototype ) ret_state . callstack . top . procedure_data = simcallstack_entry guard = ret_state . solver . true if o . TRUE_RET_EMULATION_GUARD in ret_state . options else ret_state . solver . false self . successors . add_successor ( ret_state , ret_addr , guard , 'Ijk_FakeRet' )