Source code for angr.storage.memory_mixins.multi_value_merger_mixin

from typing import Iterable, Tuple, Any, Callable, Optional

from . import MemoryMixin


[docs]class MultiValueMergerMixin(MemoryMixin): def __init__(self, *args, element_limit=5, top_func=None, phi_maker=None, **kwargs): self._element_limit = element_limit self._top_func: Callable = top_func self._phi_maker: Optional[Callable] = phi_maker super().__init__(*args, **kwargs) def _merge_values(self, values: Iterable[Tuple[Any, Any]], merged_size: int, **kwargs): values_set = {v for v, _ in values} if self._phi_maker is not None: phi_var = self._phi_maker(values_set) if phi_var is not None: return {phi_var} # try to merge it in the traditional way if len(values_set) > self._element_limit: top_val = self._top_func(merged_size * self.state.arch.byte_width) # migrate annotations annotations = [] for v in values_set: annotations += list(v.annotations) if annotations: top_val = top_val.annotate(*annotations) merged_val = {top_val} else: merged_val = values_set return merged_val
[docs] def copy(self, memo=None): copied = super().copy(memo) copied._element_limit = self._element_limit copied._top_func = self._top_func copied._phi_maker = self._phi_maker return copied