(self, input_state, sim_successors, successors)
return successors, extra_info
Filter the list of successors

        :param SimState      input_state:            Input state.
        :param SimSuccessors sim_successors:         The SimSuccessors instance.
        :param list successors:                      A list of successors generated after processing the current block.
        :return:                                     A list of successors.
        :rtype:                                      list
Filter the list of successors
Filter the list of successors
def _post_process_successors(self, input_state, sim_successors, successors):
        """
        Filter the list of successors

        :param SimState      input_state:            Input state.
        :param SimSuccessors sim_successors:         The SimSuccessors instance.
        :param list successors:                      A list of successors generated after processing the current block.
        :return:                                     A list of successors.
        :rtype:                                      list
        """

        if sim_successors.sort == 'IRSB' and input_state.thumb:
            successors = self._arm_thumb_filter_jump_successors(sim_successors.artifacts['irsb'],
                                                                successors,
                                                                lambda state: state.scratch.ins_addr,
                                                                lambda state: state.scratch.exit_stmt_idx,
                                                                lambda state: state.history.jumpkind,
                                                                )

        # If there is a call exit, we shouldn't put the default exit (which
        # is artificial) into the CFG. The exits will be Ijk_Call and
        # Ijk_FakeRet, and Ijk_Call always goes first
        extra_info = {'is_call_jump': False,
                      'call_target': None,
                      'return_target': None,
                      'last_call_exit_target': None,
                      'skip_fakeret': False,
                      }

        # Post-process jumpkind before touching all_successors
        for suc in sim_successors.all_successors:  # we process all successors here to include potential unsat successors
            suc_jumpkind = suc.history.jumpkind
            if self._is_call_jumpkind(suc_jumpkind):
                extra_info['is_call_jump'] = True
                break

        return successors, extra_info
def _post_process_successors ( self , input_state , sim_successors , successors ) : if sim_successors . sort == 'IRSB' and input_state . thumb : successors = self . _arm_thumb_filter_jump_successors ( sim_successors . artifacts [ 'irsb' ] , successors , lambda state : state . scratch . ins_addr , lambda state : state . scratch . exit_stmt_idx , lambda state : state . history . jumpkind , ) # If there is a call exit, we shouldn't put the default exit (which # is artificial) into the CFG. The exits will be Ijk_Call and # Ijk_FakeRet, and Ijk_Call always goes first extra_info = { 'is_call_jump' : False , 'call_target' : None , 'return_target' : None , 'last_call_exit_target' : None , 'skip_fakeret' : False , } # Post-process jumpkind before touching all_successors for suc in sim_successors . all_successors : # we process all successors here to include potential unsat successors suc_jumpkind = suc . history . jumpkind if self . _is_call_jumpkind ( suc_jumpkind ) : extra_info [ 'is_call_jump' ] = True break return successors , extra_info