@@ -283,7 +283,9 @@ unsafe impl<'a> bytes::BufMut for ReadBuf<'a> {
283283
284284 // SAFETY: The caller guarantees that at least `cnt` unfilled bytes have been initialized.
285285 unsafe fn advance_mut ( & mut self , cnt : usize ) {
286- self . assume_init ( cnt) ;
286+ unsafe {
287+ self . assume_init ( cnt) ;
288+ }
287289 self . advance ( cnt) ;
288290 }
289291
@@ -311,16 +313,49 @@ impl fmt::Debug for ReadBuf<'_> {
311313 }
312314}
313315
316+ // TODO: This function looks very safe, consider remove the `unsafe` qualifier.
314317unsafe fn slice_to_uninit_mut ( slice : & mut [ u8 ] ) -> & mut [ MaybeUninit < u8 > ] {
315- & mut * ( slice as * mut [ u8 ] as * mut [ MaybeUninit < u8 > ] )
318+ // SAFETY:
319+ //
320+ // 1. `MaybeUninit<u8>` has the same memory layout as `u8`.
321+ // 2. `*mut [u8] as *mut [MaybeUninit<u8>]` follows the
322+ // [Pointer-to-pointer cast].
323+ //
324+ // [Pointer-to-pointer cast]:
325+ // https://doc.rust-lang.org/1.90.0/reference/expressions/operator-expr.html#r-expr.as.pointer
326+ unsafe { & mut * ( slice as * mut [ u8 ] as * mut [ MaybeUninit < u8 > ] ) }
316327}
317328
329+ /// # Safety
330+ ///
331+ /// The caller must ensure that `slice` is fully initialized.
318332// TODO: This could use `MaybeUninit::slice_assume_init` when it is stable.
319333unsafe fn slice_assume_init ( slice : & [ MaybeUninit < u8 > ] ) -> & [ u8 ] {
320- & * ( slice as * const [ MaybeUninit < u8 > ] as * const [ u8 ] )
334+ // SAFETY:
335+ //
336+ // 1. `MaybeUninit<u8>` has the same memory layout as `u8`.
337+ // 2. `*const [MaybeUninit<u8>] as *const [u8]` follows the
338+ // [Pointer-to-pointer cast].
339+ // 3. The caller guarantees that `slice` is fully initialized.
340+ //
341+ // [Pointer-to-pointer cast]:
342+ // https://doc.rust-lang.org/1.90.0/reference/expressions/operator-expr.html#r-expr.as.pointer
343+ unsafe { & * ( slice as * const [ MaybeUninit < u8 > ] as * const [ u8 ] ) }
321344}
322345
323346// TODO: This could use `MaybeUninit::slice_assume_init_mut` when it is stable.
347+ /// # Safety
348+ ///
349+ /// The caller must ensure that `slice` is fully initialized.
324350unsafe fn slice_assume_init_mut ( slice : & mut [ MaybeUninit < u8 > ] ) -> & mut [ u8 ] {
325- & mut * ( slice as * mut [ MaybeUninit < u8 > ] as * mut [ u8 ] )
351+ // SAFETY:
352+ //
353+ // 1. `MaybeUninit<u8>` has the same memory layout as `u8`.
354+ // 2. `*const [MaybeUninit<u8>] as *const [u8]` follows the
355+ // [Pointer-to-pointer cast].
356+ // 3. The caller guarantees that `slice` is fully initialized.
357+ //
358+ // [Pointer-to-pointer cast]:
359+ // https://doc.rust-lang.org/1.90.0/reference/expressions/operator-expr.html#r-expr.as.pointer
360+ unsafe { & mut * ( slice as * mut [ MaybeUninit < u8 > ] as * mut [ u8 ] ) }
326361}
0 commit comments