rustc_middle::mir::interpret::pointer

Trait Provenance

Source
pub trait Provenance:
    Copy
    + Debug
    + 'static {
    const OFFSET_IS_ADDR: bool;

    // Required methods
    fn fmt(ptr: &Pointer<Self>, f: &mut Formatter<'_>) -> Result;
    fn get_alloc_id(self) -> Option<AllocId>;
    fn join(left: Option<Self>, right: Option<Self>) -> Option<Self>;
}
Expand description

This trait abstracts over the kind of provenance that is associated with a Pointer. It is mostly opaque; the Machine trait extends it with some more operations that also have access to some global state. The Debug rendering is used to display bare provenance, and for the default impl of fmt.

Required Associated Constants§

Source

const OFFSET_IS_ADDR: bool

Says whether the offset field of Pointers with this provenance is the actual physical address.

  • If false, the offset must be relative. This means the bytes representing a pointer are different from what the Abstract Machine prescribes, so the interpreter must prevent any operation that would inspect the underlying bytes of a pointer, such as ptr-to-int transmutation. A ReadPointerAsBytes error will be raised in such situations.
  • If true, the interpreter will permit operations to inspect the underlying bytes of a pointer, and implement ptr-to-int transmutation by stripping provenance.

Required Methods§

Source

fn fmt(ptr: &Pointer<Self>, f: &mut Formatter<'_>) -> Result

Determines how a pointer should be printed.

Source

fn get_alloc_id(self) -> Option<AllocId>

If OFFSET_IS_ADDR == false, provenance must always be able to identify the allocation this ptr points to (i.e., this must return Some). Otherwise this function is best-effort (but must agree with Machine::ptr_get_alloc). (Identifying the offset in that allocation, however, is harder – use Memory::ptr_get_alloc for that.)

Source

fn join(left: Option<Self>, right: Option<Self>) -> Option<Self>

Defines the ‘join’ of provenance: what happens when doing a pointer load and different bytes have different provenance.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§