sptr: The Strict Provenance Polyfill

crates.io

//! This library provides a stable polyfill for Rust's Strict Provenance experiment. //! //! Swapping between the two should be as simple as switching between sptr:: and ptr:: //! for static functions. For methods, you must import sptr::Strict into your module for //! the extension trait's methods to overlay std. The compiler will (understandably) //! complain that you are overlaying std, so you will need to also silence that as //! seen in the following example: //! //! rust //! #![allow(unstable_name_collisions)] //! use sptr::Strict; //! //! let ptr = sptr::invalid_mut::<u8>(1); //! println!("{}", ptr.addr()); //! //! //! By default, this crate will also mark methods on pointers as "deprecated" if they are //! incompatible with strict_provenance. If you don't want this, set default-features = false //! in your Cargo.toml. //! //! Rust is the canonical source of definitions for these APIs and semantics, but the docs //! here will vaguely try to mirror the docs checked into Rust. The current APIs are: //! //! //! rust ,ignore //! core::ptr (sptr) //! pub fn invalid<T>(addr: usize) -> *const T; //! pub fn invalid_mut<T>(addr: usize) -> *mut T; //! //! // core::pointer (sptr::Strict) //! pub fn addr(self) -> usize; //! pub fn with_addr(self, addr: usize) -> Self; //! pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self; //! //! // DEPRECATED BY THIS MODEL in core::pointer (sptr::Strict) //! // (disable with `default-features = false`) //! pub fn to_bits(self) -> usize; //! pub fn from_bits(usize) -> Self; //!