diff --git a/library/core/src/ptr/non_null.rs b/library/core/src/ptr/non_null.rs index 775034399717d..dac339518469d 100644 --- a/library/core/src/ptr/non_null.rs +++ b/library/core/src/ptr/non_null.rs @@ -1590,9 +1590,14 @@ impl NonNull<[T]> { #[rustc_const_stable(feature = "const_slice_from_raw_parts_mut", since = "1.83.0")] #[must_use] #[inline] + // `result.len()` reads the length from the wide-pointer metadata without + // creating a reference: `slice_from_raw_parts` is a safe function with no + // validity requirements on `data`, so the postcondition must not + // dereference the resulting pointer (`unsafe { result.as_ref() }.len()`, + // as used previously, is UB for dangling or misaligned `data`). #[ensures(|result| !result.pointer.is_null() && result.pointer as *const T == data.pointer - && unsafe { result.as_ref() }.len() == len)] + && result.len() == len)] pub const fn slice_from_raw_parts(data: NonNull, len: usize) -> Self { // SAFETY: `data` is a `NonNull` pointer which is necessarily non-null unsafe { Self::new_unchecked(super::slice_from_raw_parts_mut(data.as_ptr(), len)) }