Checked transmute example

⚓ Rust    📅 2025-12-08    👤 surdeus    👁️ 7      

surdeus

Warning

This post was published 61 days ago. The information described in this article may have changed.

Info

This post is auto-generated from RSS feed The Rust Programming Language Forum - Latest topics. Source: Checked transmute example

I created just a simple checked_transmute like

// Safety: All bit patterns for this type are valid values.
// No invalid niches, no required padding patterns, no special discriminants.
pub unsafe trait AnyBitPattern: Copy {}
unsafe impl AnyBitPattern for u8 {}
unsafe impl AnyBitPattern for u16 {}
unsafe impl AnyBitPattern for u32 {}
unsafe impl AnyBitPattern for u64 {}
unsafe impl AnyBitPattern for usize {}

unsafe impl AnyBitPattern for i8 {}
unsafe impl AnyBitPattern for i16 {}
unsafe impl AnyBitPattern for i32 {}
unsafe impl AnyBitPattern for i64 {}
unsafe impl AnyBitPattern for isize {}

unsafe impl AnyBitPattern for f32 {}
unsafe impl AnyBitPattern for f64 {}

// Arrays compose if the element is AnyBitPattern
unsafe impl<T: AnyBitPattern, const N: usize> AnyBitPattern for [T; N] {}
unsafe impl AnyBitPattern for u128 {}
unsafe impl AnyBitPattern for i128 {}
#[repr(transparent)]
#[derive(Copy, Clone)]
pub struct WrapU32(pub u32);
unsafe impl AnyBitPattern for WrapU32 {}
pub fn transmute_checked<Src, Dst>(src: Src) -> Option<Dst>
where
    Src: Copy + Sized + AnyBitPattern,
    Dst: Copy + Sized + AnyBitPattern,
{
    if size_of::<Src>() != size_of::<Dst>() { return None; }
    if align_of::<Src>() != align_of::<Dst>() { return None; }

    Some(unsafe { *(&src as *const Src as *const Dst) })
}



3 posts - 2 participants

Read full topic

🏷️ Rust_feed