Source code for angr.storage.memory_mixins.conditional_store_mixin
import claripy
from . import MemoryMixin
[docs]class ConditionalMixin(MemoryMixin):
[docs] def load(self, addr, condition=None, fallback=None, **kwargs):
res = super().load(addr, condition=condition, **kwargs)
if condition is not None and fallback is not None:
res = claripy.If(condition, res, fallback)
return res
[docs] def store(self, addr, data, size=None, condition=None, **kwargs):
condition = self.state._adjust_condition(condition)
if condition is None or self.state.solver.is_true(condition):
super().store(addr, data, size=size, **kwargs)
return
if self.state.solver.is_false(condition):
return
default_data = super().load(addr, size=len(data) // self.state.arch.byte_width, **kwargs)
conditional_data = claripy.If(condition, data, default_data)
super().store(addr, conditional_data, size=size, **kwargs)