Source code for angr.concretization_strategies.norepeats_range
from . import SimConcretizationStrategy
from ..errors import SimMergeError
[docs]class SimConcretizationStrategyNorepeatsRange(SimConcretizationStrategy):
"""
Concretization strategy that resolves a range, with no repeats.
"""
[docs] def __init__(self, repeat_expr, min=None, granularity=None, **kwargs): # pylint:disable=redefined-builtin
super().__init__(**kwargs)
self._repeat_expr = repeat_expr
self._repeat_min = min
self._repeat_granularity = granularity
def _concretize(self, memory, addr, **kwargs):
child_constraints = (addr >= self._repeat_min, addr < self._repeat_min + self._repeat_granularity)
extra_constraints = kwargs.pop("extra_constraints", None)
if extra_constraints is not None:
child_constraints += tuple(extra_constraints)
c = self._any(memory, addr, extra_constraints=child_constraints)
self._repeat_min = c + self._repeat_granularity
return [c]
[docs] def copy(self):
return SimConcretizationStrategyNorepeatsRange(
repeat_expr=self._repeat_expr, min=self._repeat_min, granularity=self._repeat_granularity, exact=self._exact
)
[docs] def merge(self, others):
if not all(self._repeat_expr is o._repeat_expr for o in others):
raise SimMergeError("Unable to merge two different repeat expressions.")
self._repeat_min = max(self._repeat_min, max(o._repeat_min for o in others))
self._repeat_granularity = max(self._repeat_granularity, max(o._repeat_granularity for o in others))