@@ -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