Source code for angr.state_plugins.sim_event

import traceback
import itertools

event_id_count = itertools.count()


[docs]class SimEvent: """ A SimEvent is a log entry for some notable event during symbolic execution. It logs the location it was generated (ins_addr, bbl_addr, stmt_idx, and sim_procedure) as well as arbitrary tags (objects). You may also be interested in SimAction, which is a specialization of SimEvent for CPU events. """ # def __init__(self, address=None, stmt_idx=None, message=None, exception=None, traceback=None):
[docs] def __init__(self, state, event_type, **kwargs): self.id = next(event_id_count) self.type = event_type self.ins_addr = state.scratch.ins_addr self.bbl_addr = state.scratch.bbl_addr self.stmt_idx = state.scratch.stmt_idx self.sim_procedure = None if state.scratch.sim_procedure is None else state.scratch.sim_procedure.canonical self.objects = dict(kwargs) self.arch = state.arch
def __repr__(self): return "<SimEvent %s %d, with fields %s>" % (self.type, self.id, ", ".join(self.objects.keys())) def _copy_event(self): c = self.__class__.__new__(self.__class__) c.id = self.id c.type = self.type c.bbl_addr = self.bbl_addr c.stmt_idx = self.stmt_idx c.sim_procedure = self.sim_procedure c.objects = dict(self.objects) return c
[docs]def resource_event(state, exception): for frame, lineno in reversed(list(traceback.walk_tb(exception.__traceback__))): module = frame.f_globals.get("__name__", "").split(".") function = frame.f_code.co_name if module[0] == "claripy" or module in ( ["angr", "state_plugins", "solver"], ["angr", "state_plugins", "sim_action_object"], ): continue state.history.add_event( "insufficient_resources", module=module, function=function, lineno=lineno, type=type(exception), reason=exception.args, ) break