From 830adfbc104f4db4fdb4cdb4b57f83b52edd8bae Mon Sep 17 00:00:00 2001 From: numzero Date: Wed, 23 Sep 2026 20:36:04 +0300 Subject: [PATCH] fix UB =) --- src/lib.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d046d3d..1ff288c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,8 +25,16 @@ pub struct Dyn<'a, Trait: ?Sized + 'a> { impl<'a, Trait: ?Sized + 'a> Dyn<'a, Trait> { pub type Target = Trait; - fn as_ptr(&self) -> *const Self::Target { - ptr::from_raw_parts::(&self.data, self.meta) + /// SAFETY: + /// The `meta` field in `this` must be valid for reading. + /// + /// The returned pointer inherits validity from the input pointer. + unsafe fn ptr(this: *mut Self) -> *mut Self::Target { + let pmeta = &raw const (*this).meta; + // SAFETY: `meta` is valid for reading, per the function safety requirement. + let meta = unsafe { *pmeta }; + let pdata = &raw mut (*this).data; + ptr::from_raw_parts_mut::(pdata, meta) } } @@ -34,13 +42,15 @@ impl<'a, Trait: ?Sized + 'a> ops::Deref for Dyn<'a, Trait> { type Target = Trait; fn deref(&self) -> &Self::Target { - unsafe { self.as_ptr().as_ref_unchecked() } + // SAFETY: `self` is valid for reading. + unsafe { Self::ptr(self as *const Self as *mut Self).as_ref_unchecked() } } } impl<'a, Trait: ?Sized + 'a> ops::DerefMut for Dyn<'a, Trait> { fn deref_mut(&mut self) -> &mut Self::Target { - unsafe { self.as_ptr().cast_mut().as_mut_unchecked() } + // SAFETY: `self` is valid for writing. + unsafe { Self::ptr(self as *mut Self).as_mut_unchecked() } } }