unsafe-binders

Crates.iounsafe-binders
lib.rsunsafe-binders
version0.0.1
created_at2025-12-08 15:34:24.981975+00
updated_at2025-12-08 15:34:24.981975+00
descriptionStable rust polyfill of `unsafe<'lt> …` binders
homepage
repositoryhttps://github.com/danielhenrymantilla/unsafe-binders.rs
max_upload_size
id1973827
size48,326
Daniel Henry-Mantilla (danielhenrymantilla)

documentation

https://docs.rs/unsafe-binders

README

::unsafe-binders

Stable rust polyfill of unsafe<'lt> … binders.

Repository Latest version Documentation MSRV License CI no_std compatible


Conceptually, unsafe binders are the way to express the 'unsafe/'never/'expired/'dangling lifetime used in certain unsafe constructs (e.g., self-referential data), in a way less unsoundness-prone way as using 'static instead would be:

  • by virtue of requiring unsafe to access the data,

  • and it not performing liveness or (lack-of-)aliasing assertions (courtesy of ::maybe-dangling, like 'static-infected types may accidentally do.

Example

use ::unsafe_binders::{DropMarker, Unsafe};

pub struct SelfReferential {
    full_name: String,
    first_name: Unsafe![DropMarker::NoDropGlue, <'this> &'this str],
                                           // using lifetime-elision shorthand syntax:
    last_name: Unsafe![DropMarker::NoDropGlue, &str],
}

impl SelfReferential {
    pub fn new(full_name: String) -> Option<Self> {
        let (first_name, last_name) = full_name.split_once(" ")?;
        // erase the `&'full_name` lifetime:
        let first_name: Unsafe![_, &str] = Unsafe::wrap_binder_copy(first_name);
                               // shorthand syntax
        let last_name: Unsafe![&str] = Unsafe::wrap_binder_copy(last_name);
        Some(Self {
            full_name,
            first_name,
            last_name,
        })
    }

    pub fn first_name<'r>(&'r self) -> &'r str {
        unsafe {
            self.first_name.unwrap_binder_ref::<'_, 'r>()
        }
    }

    pub fn last_name<'r>(&'r self) -> &'r str {
        unsafe {
            self.last_name.unwrap_binder_ref::<'_, 'r>()
        }
    }
}
Commit count: 0

cargo fmt