angr.concretization_strategies.norepeats 源代码

from __future__ import annotations

import itertools

from .base import SimConcretizationStrategy


[文档] class SimConcretizationStrategyNorepeats(SimConcretizationStrategy): """ Concretization strategy that resolves addresses, without repeating. """
[文档] def __init__(self, repeat_expr, repeat_constraints=None, **kwargs): super().__init__(**kwargs) self._repeat_constraints = [] if repeat_constraints is None else repeat_constraints self._repeat_expr = repeat_expr
def _concretize(self, memory, addr, **kwargs): child_constraints = (*tuple(self._repeat_constraints), addr == self._repeat_expr) 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, **kwargs) self._repeat_constraints.append(self._repeat_expr != c) return [c]
[文档] def copy(self): return SimConcretizationStrategyNorepeats( repeat_expr=self._repeat_expr, repeat_constraints=list(self._repeat_constraints), exact=self._exact )
[文档] def merge(self, others): seen = {s.hash() for s in self._repeat_constraints} for c in itertools.chain.from_iterable(o._repeat_constraints for o in others): if c.hash() not in seen: seen.add(c.hash()) self._repeat_constraints.append(c)