vstd 0.0.0-2026-04-20-1748

Verus Standard Library: Useful specifications and lemmas for verifying Rust code
Documentation
use super::super::prelude::*;
use super::super::raw_ptr::MemContents;
use core::mem::MaybeUninit;

use verus as verus_;
verus_! {

#[verifier::external_type_specification]
#[verifier::external_body]
#[verifier::accept_recursive_types(T)]
pub struct ExMaybeUninit<T>(MaybeUninit<T>);

pub trait MaybeUninitAdditionalSpecFns<T> {
    spec fn mem_contents(self) -> MemContents<T>;
    spec fn as_option(self) -> Option<T>;
}

impl<T> MaybeUninitAdditionalSpecFns<T> for MaybeUninit<T> {
    uninterp spec fn mem_contents(self) -> MemContents<T>;

    open spec fn as_option(self) -> Option<T> {
        match self.mem_contents() {
            MemContents::Init(v) => Some(v),
            MemContents::Uninit => None,
        }
    }
}

pub assume_specification<T>[ MaybeUninit::<T>::new ](val: T) -> (res: MaybeUninit<T>)
    ensures res.mem_contents() == MemContents::Init(val),
    opens_invariants none
    no_unwind;

pub assume_specification<T>[ MaybeUninit::<T>::uninit ]() -> (res: MaybeUninit<T>)
    ensures res.mem_contents() === MemContents::Uninit,
    opens_invariants none
    no_unwind;

pub assume_specification<T>[ MaybeUninit::<T>::assume_init ](m: MaybeUninit<T>) -> T
    requires m.mem_contents().is_init(),
    returns m.mem_contents().value(),
    opens_invariants none
    no_unwind;

pub assume_specification<T>[ MaybeUninit::<T>::assume_init_ref ](m: &MaybeUninit<T>) -> (ret: &T)
    requires m.mem_contents().is_init(),
    ensures ret == m.mem_contents().value(),
    opens_invariants none
    no_unwind;

}