defsimulation_manager(self, thing=None, **kwargs): """ Constructs a new simulation manager. :param thing: Optional - What to put in the new SimulationManager's active stash (either a SimState or a list of SimStates). :param kwargs: Any additional keyword arguments will be passed to the SimulationManager constructor :returns: The new SimulationManager :rtype: angr.sim_manager.SimulationManager Many different types can be passed to this method: * If nothing is passed in, the SimulationManager is seeded with a state initialized for the program entry point, i.e. :meth:`entry_state()`. * If a :class:`SimState` is passed in, the SimulationManager is seeded with that state. * If a list is passed in, the list must contain only SimStates and the whole list will be used to seed the SimulationManager.#***?什么意思 """ if thing isNone: thing = [ self.entry_state() ] elifisinstance(thing, (list, tuple)): ifany(notisinstance(val, SimState) for val in thing): raise AngrError("Bad type to initialize SimulationManager") elifisinstance(thing, SimState): thing = [ thing ] else: raise AngrError("BadType to initialze SimulationManager: %s" % repr(thing)) return SimulationManager(self.project, active_states=thing, **kwargs)
defsuccessors(self, *args, **kwargs): """ Perform execution using any applicable engine. Enumerate the current engines and use the first one that works. Return a SimSuccessors object classifying the results of the run. :param state: The state to analyze :param addr: optional, an address to execute at instead of the state's ip :param jumpkind: optional, the jumpkind of the previous exit :param inline: This is an inline execution. Do not bother copying the state. Additional keyword arguments will be passed directly into each engine's process method. """