Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
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