(self, jump: IndirectJump, jump_addr, resolved_by, targets: List[int])
Called when an indirect jump is successfully resolved.

        :param jump:                                The resolved indirect jump.
        :param IndirectJumpResolver resolved_by:    The resolver used to resolve this indirect jump.
        :param list targets:                        List of indirect jump targets.

        :return:                                    None
Called when an indirect jump is successfully resolved.
Called when an indirect jump is successfully resolved .
def _indirect_jump_resolved(self, jump: IndirectJump, jump_addr, resolved_by, targets: List[int]):
        """
        Called when an indirect jump is successfully resolved.

        :param jump:                                The resolved indirect jump.
        :param IndirectJumpResolver resolved_by:    The resolver used to resolve this indirect jump.
        :param list targets:                        List of indirect jump targets.

        :return:                                    None
        """

        source_addr = jump.addr

        if jump.jumptable:
            # Fill in the jump_tables dict
            self.jump_tables[jump.addr] = jump
            # occupy the jump table region
            if jump.jumptable_addr is not None:
                self._seg_list.occupy(jump.jumptable_addr, jump.jumptable_size, "data")
                if self._collect_data_ref:
                    if jump.jumptable_addr in self._memory_data:
                        memory_data = self._memory_data[jump.jumptable_addr]
                        memory_data.size = jump.jumptable_size
                        memory_data.max_size = jump.jumptable_size
                        memory_data.sort = MemoryDataSort.Unknown
                    else:
                        memory_data = MemoryData(jump.jumptable_addr, jump.jumptable_size, MemoryDataSort.Unknown,
                                                 max_size=jump.jumptable_size)
                        self._memory_data[jump.jumptable_addr] = memory_data

        jump.resolved_targets = targets
        all_targets = set(targets)
        for addr in all_targets:
            to_outside = (jump.jumpkind == 'Ijk_Call'
                          or jump.type == IndirectJumpType.Vtable
                          or addr in self.functions
                          or not self._addrs_belong_to_same_section(jump.addr, addr))

            # TODO: get a better estimate of the function address
            if jump.type == IndirectJumpType.Vtable:
                target_func_addr = addr
            else:
                target_func_addr = jump.func_addr if not to_outside else addr
            func_edge = FunctionTransitionEdge(self._nodes[source_addr], addr, jump.func_addr, to_outside=to_outside,
                                               dst_func_addr=target_func_addr
                                               )
            job = CFGJob(addr, target_func_addr, jump.jumpkind,
                         last_addr=source_addr,
                         src_node=self._nodes[source_addr],
                         src_ins_addr=jump.ins_addr,
                         src_stmt_idx=jump.stmt_idx,
                         func_edges=[func_edge],
                         )
            self._insert_job(job)
            self._register_analysis_job(target_func_addr, job)

        self._deregister_analysis_job(jump.func_addr, jump)

        CFGBase._indirect_jump_resolved(self, jump, jump.addr, resolved_by, targets)
def _indirect_jump_resolved ( self , jump : IndirectJump , jump_addr , resolved_by , targets : List [ int ] ) : source_addr = jump . addr if jump . jumptable : # Fill in the jump_tables dict self . jump_tables [ jump . addr ] = jump # occupy the jump table region if jump . jumptable_addr is not None : self . _seg_list . occupy ( jump . jumptable_addr , jump . jumptable_size , "data" ) if self . _collect_data_ref : if jump . jumptable_addr in self . _memory_data : memory_data = self . _memory_data [ jump . jumptable_addr ] memory_data . size = jump . jumptable_size memory_data . max_size = jump . jumptable_size memory_data . sort = MemoryDataSort . Unknown else : memory_data = MemoryData ( jump . jumptable_addr , jump . jumptable_size , MemoryDataSort . Unknown , max_size = jump . jumptable_size ) self . _memory_data [ jump . jumptable_addr ] = memory_data jump . resolved_targets = targets all_targets = set ( targets ) for addr in all_targets : to_outside = ( jump . jumpkind == 'Ijk_Call' or jump . type == IndirectJumpType . Vtable or addr in self . functions or not self . _addrs_belong_to_same_section ( jump . addr , addr ) ) # TODO: get a better estimate of the function address if jump . type == IndirectJumpType . Vtable : target_func_addr = addr else : target_func_addr = jump . func_addr if not to_outside else addr func_edge = FunctionTransitionEdge ( self . _nodes [ source_addr ] , addr , jump . func_addr , to_outside = to_outside , dst_func_addr = target_func_addr ) job = CFGJob ( addr , target_func_addr , jump . jumpkind , last_addr = source_addr , src_node = self . _nodes [ source_addr ] , src_ins_addr = jump . ins_addr , src_stmt_idx = jump . stmt_idx , func_edges = [ func_edge ] , ) self . _insert_job ( job ) self . _register_analysis_job ( target_func_addr , job ) self . _deregister_analysis_job ( jump . func_addr , jump ) CFGBase . _indirect_jump_resolved ( self , jump , jump . addr , resolved_by , targets )