Source code for angr.analyses.propagator.engine_base
from typing import Optional, TYPE_CHECKING
import logging
from ...engines.light import SimEngineLight
from ...errors import SimEngineError
if TYPE_CHECKING:
from angr.analyses.reaching_definitions.reaching_definitions import ReachingDefinitionsModel
l = logging.getLogger(name=__name__)
[docs]class SimEnginePropagatorBase(SimEngineLight): # pylint:disable=abstract-method
[docs] def __init__(
self,
stack_pointer_tracker=None,
project=None,
propagate_tmps=True,
arch=None,
reaching_definitions: Optional["ReachingDefinitionsModel"] = None,
):
super().__init__()
# Used in the VEX engine
self._project = project
self.arch = arch
self.base_state = None
self._load_callback = None
self._propagate_tmps: bool = propagate_tmps
self._reaching_definitions = reaching_definitions
# Used in the AIL engine
self._stack_pointer_tracker = stack_pointer_tracker
[docs] def process(self, state, *args, **kwargs):
self.project = kwargs.pop("project", None)
self.base_state = kwargs.pop("base_state", None)
self._load_callback = kwargs.pop("load_callback", None)
try:
self._process(state, None, block=kwargs.pop("block", None))
except SimEngineError as ex:
if kwargs.pop("fail_fast", False) is True:
raise ex
l.error(ex, exc_info=True)
return self.state