Source code for angr.storage.memory_mixins.regioned_memory.abstract_merger_mixin

import logging
from typing import Iterable, Tuple, Any

from .. import MemoryMixin

l = logging.getLogger(name=__name__)


[docs]class AbstractMergerMixin(MemoryMixin): def _merge_values(self, values: Iterable[Tuple[Any, Any]], merged_size: int, **kwargs): # if self.category == 'reg' and self.state.arch.register_endness == 'Iend_LE': # should_reverse = True # elif self.state.arch.memory_endness == 'Iend_LE': # should_reverse = True # else: # should_reverse = False values = list(values) merged_val = values[0][0] # if should_reverse: merged_val = merged_val.reversed for tm, _ in values[1:]: # if should_reverse: tm = tm.reversed if self._is_uninitialized(tm): continue l.info("Merging %s %s...", merged_val, tm) merged_val = merged_val.union(tm) l.info("... Merged to %s", merged_val) # if should_reverse: # merged_val = merged_val.reversed if not values[0][0].uninitialized and self.state.solver.backends.vsa.identical(merged_val, values[0][0]): return None return merged_val @staticmethod def _is_uninitialized(a): return getattr(a._model_vsa, "uninitialized", False)