docs: def add_successor(self, state, target, guard, jumpkind, add_guard=True, exit_stmt_idx=None, exit_ins_addr=None,
                        source=None):
          """
          Add a successor state of the SimRun.
          This procedure stores method parameters into state.scratch, does some housekeeping,
          and calls out to helper functions to prepare the state and categorize it into the appropriate
          successor lists.
  
          :param SimState state:    The successor state.
          :param target:            The target (of the jump/call/ret).
          :param guard:             The guard expression.
          :param str jumpkind:      The jumpkind (call, ret, jump, or whatnot).
          :param bool add_guard:    Whether to add the guard constraint (default: True).
          :param int exit_stmt_idx: The ID of the exit statement, an integer by default. 'default'
                                    stands for the default exit, and None means it's not from a
                                    statement (for example, from a SimProcedure).
          :param int exit_ins_addr: The instruction pointer of this exit, which is an integer by default.
          :param int source:        The source of the jump (i.e., the address of the basic block).
          """
  
          # First, trigger the SimInspect breakpoint
          state._inspect('exit', BP_BEFORE, exit_target=target, exit_guard=guard, exit_jumpkind=jumpkind)
          state.scratch.target = state._inspect_getattr("exit_target", target)
          state.scratch.guard = state._inspect_getattr("exit_guard", guard)
          state.history.jumpkind = state._inspect_getattr("exit_jumpkind", jumpkind)
          state.history.jump_target = state.scratch.target
          state.history.jump_guard = state.scratch.guard
  
          # track some vex-specific stuff here for now
          state.scratch.source = source if source is not None else self.addr
          state.scratch.exit_stmt_idx = exit_stmt_idx
          state.scratch.exit_ins_addr = exit_ins_addr
  
          self._preprocess_successor(state, add_guard=add_guard)
  
          if state.history.jumpkind == 'Ijk_SigFPE_IntDiv' and o.PRODUCE_ZERODIV_SUCCESSORS not in state.options:
              return
  
          self._categorize_successor(state)
          state._inspect('exit', BP_AFTER, exit_target=target, exit_guard=guard, exit_jumpkind=jumpkind)
          if state.supports_inspect:
              state.inspect.downsize()