pub(crate) struct MemoryContent<'z3, 'tcx> {
pub(crate) byte_array: Option<Array<'z3>>,
pub(crate) byte_written: FxHashSet<usize>,
pub(crate) values: FxHashMap<(Ty<'tcx>, Vec<usize>), VmValue<'z3, 'tcx>>,
pub(crate) facts: ContentFacts,
}Expand description
The per-allocation contents: the byte layer, the typed-value layer, and the content facts.
Fields§
§byte_array: Option<Array<'z3>>Byte value function: byte[i] = select(array, i) for any (possibly
symbolic) offset i. None when no byte has been written. Unwritten
offsets read back the UNINIT sentinel, so init/nul are derived
from select, not stored per byte.
byte_written: FxHashSet<usize>The concrete byte offsets written to this allocation. Z3 arrays cannot
enumerate their stored indices, so the byte-level checkers iterate this
set directly instead of scanning the allocation’s (possibly symbolic or
huge) size range. Only concrete writes are recorded: a symbolic
byte_write (e.g. a symbolic ValidCStr length) still updates the byte
array but not this set.
values: FxHashMap<(Ty<'tcx>, Vec<usize>), VmValue<'z3, 'tcx>>The typed-value (Value) layer: (viewed_type, path) → value. path == []
is the allocation’s whole value (the rvalue bound to a local) and
path == [i, ..] is field i, both viewed as viewed_type. The
viewed_type distinguishes reinterprets of the same allocation under
different ADTs (e.g. LeafNode vs InternalNode cast views), so field
index 1 resolves to parent_idx under LeafNode and edges under
InternalNode without colliding. This is the alloc-keyed counterpart to
the byte-level Self::byte_array; the Local-keyed
local_value/set_local/field_value/set_field_value resolve a
local’s backing allocation and then read/write this layer.
facts: ContentFactsContent facts (initialized/cstr_trusted/utf8_trusted); value-level
facts live on each VmValue::facts.
Trait Implementations§
Auto Trait Implementations§
impl<'z3, 'tcx> !DynSend for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> !DynSync for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> !RefUnwindSafe for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> !Send for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> !Sync for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> !UnwindSafe for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> Freeze for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> Unpin for MemoryContent<'z3, 'tcx>
impl<'z3, 'tcx> UnsafeUnpin for MemoryContent<'z3, 'tcx>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more