angr.engines.vex.light.resilience 源代码

from __future__ import annotations
from angr.engines.vex.light import VEXMixin
from angr import errors

raiseme = object()


[文档] class VEXResilienceMixin(VEXMixin): def _check_unsupported_ccall(self, func_name, retty, args, **kwargs): return raiseme def _check_errored_ccall(self, func_name, ty, args, **kwargs): return raiseme def _check_unsupported_op(self, op, args): return raiseme def _check_zero_division(self, op, args): return raiseme def _check_errored_op(self, op, args): return raiseme def _check_unsupported_dirty(self, func_name, ty, args, **kwargs): return raiseme def _check_errored_dirty(self, func_name, ty, args, **kwargs): return raiseme def _check_errored_stmt(self, stmt): return raiseme
def _make_wrapper(func, *args): excs = args[::2] handlers = args[1::2] def inner(self, *iargs, **ikwargs): try: return getattr(super(VEXResilienceMixin, self), func)(*iargs, **ikwargs) except excs as e: for exc, handler in zip(excs, handlers): if isinstance(e, exc): v = getattr(self, handler)(*iargs, **ikwargs) if v is raiseme: raise return v assert False, "this should be unreachable if Python is working correctly" setattr(VEXResilienceMixin, func, inner) _make_wrapper( "_perform_vex_stmt_Dirty_call", errors.UnsupportedDirtyError, "_check_unsupported_dirty", errors.SimOperationError, "_check_errored_dirty", ) _make_wrapper( "_perform_vex_expr_CCall", errors.UnsupportedCCallError, "_check_unsupported_ccall", errors.SimOperationError, "_check_errored_ccall", ) _make_wrapper( "_perform_vex_expr_Op", errors.SimZeroDivisionException, "_check_zero_division", errors.UnsupportedIROpError, "_check_unsupported_op", ) _make_wrapper("_handle_vex_stmt", errors.SimError, "_check_errored_stmt")