Skip to content

Commit 669b857

Browse files
committed
Replace casts of slices (unsized types) with slice::from_raw_parts[_mut]().
libcore/libstd is allowed to make assumptions avoid the validity about casts that extern code in general cannot. In particular it isn't clear that casting `[T]` to `[MaybeUninit<T>]` or vice-versa is guaranteed to be sound. Avoid the issue by using an alternative to casts.
1 parent bcbadc1 commit 669b857

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

src/util.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
#![allow(dead_code)]
2-
use core::{mem::MaybeUninit, ptr};
2+
use core::{mem::MaybeUninit, ptr, slice};
33

44
/// Polyfill for `maybe_uninit_slice` feature's
55
/// `MaybeUninit::slice_assume_init_mut`. Every element of `slice` must have
66
/// been initialized.
77
#[inline(always)]
88
pub unsafe fn slice_assume_init_mut<T>(slice: &mut [MaybeUninit<T>]) -> &mut [T] {
99
// SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
10-
&mut *(slice as *mut [MaybeUninit<T>] as *mut [T])
10+
// The caller promises that every element of `slice` has been initialized.
11+
slice::from_raw_parts_mut(slice.as_mut_ptr() as *mut T, slice.len())
1112
}
1213

1314
#[inline]
@@ -21,7 +22,7 @@ pub fn slice_as_uninit<T>(slice: &[T]) -> &[MaybeUninit<T>] {
2122
// SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
2223
// There is no risk of writing a `MaybeUninit<T>` into the result since
2324
// the result isn't mutable.
24-
unsafe { &*(slice as *const [T] as *const [MaybeUninit<T>]) }
25+
unsafe { slice::from_raw_parts(slice.as_ptr() as *const MaybeUninit<T>, slice.len()) }
2526
}
2627

2728
/// View an mutable initialized array as potentially-uninitialized.
@@ -31,5 +32,5 @@ pub fn slice_as_uninit<T>(slice: &[T]) -> &[MaybeUninit<T>] {
3132
#[inline(always)]
3233
pub unsafe fn slice_as_uninit_mut<T>(slice: &mut [T]) -> &mut [MaybeUninit<T>] {
3334
// SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
34-
&mut *(slice as *mut [T] as *mut [MaybeUninit<T>])
35+
slice::from_raw_parts_mut(slice.as_mut_ptr() as *mut MaybeUninit<T>, slice.len())
3536
}

0 commit comments

Comments
 (0)