|
8 | 8 | // option. This file may not be copied, modified, or distributed |
9 | 9 | // except according to those terms. |
10 | 10 |
|
| 11 | +use core::mem; |
11 | 12 | use core::ptr::*; |
12 | | -use core::slice; |
13 | 13 | use core::cell::RefCell; |
14 | 14 |
|
| 15 | + |
| 16 | +/// Create a null pointer to a mutable slice. This is implemented like |
| 17 | +/// `slice::from_raw_parts_mut`, which we can't use directly because |
| 18 | +/// having a null `&mut [T]` even temporarily is UB. |
| 19 | +fn null_slice<T>() -> *mut [T] { |
| 20 | + unsafe { |
| 21 | + #[repr(C)] |
| 22 | + struct Repr<T> { |
| 23 | + pub data: *mut T, |
| 24 | + pub len: usize, |
| 25 | + } |
| 26 | + |
| 27 | + mem::transmute(Repr { data: null_mut::<T>(), len: 0 }) |
| 28 | + } |
| 29 | +} |
| 30 | + |
15 | 31 | #[test] |
16 | 32 | fn test() { |
17 | 33 | unsafe { |
@@ -78,13 +94,11 @@ fn test_is_null() { |
78 | 94 | let mz: *mut [u8] = &mut []; |
79 | 95 | assert!(!mz.is_null()); |
80 | 96 |
|
81 | | - unsafe { |
82 | | - let ncs: *const [u8] = slice::from_raw_parts(null(), 0); |
83 | | - assert!(ncs.is_null()); |
| 97 | + let ncs: *const [u8] = null_slice(); |
| 98 | + assert!(ncs.is_null()); |
84 | 99 |
|
85 | | - let nms: *mut [u8] = slice::from_raw_parts_mut(null_mut(), 0); |
86 | | - assert!(nms.is_null()); |
87 | | - } |
| 100 | + let nms: *mut [u8] = null_slice(); |
| 101 | + assert!(nms.is_null()); |
88 | 102 | } |
89 | 103 |
|
90 | 104 | #[test] |
@@ -123,10 +137,10 @@ fn test_as_ref() { |
123 | 137 | let mz: *mut [u8] = &mut []; |
124 | 138 | assert_eq!(mz.as_ref(), Some(&[][..])); |
125 | 139 |
|
126 | | - let ncs: *const [u8] = slice::from_raw_parts(null(), 0); |
| 140 | + let ncs: *const [u8] = null_slice(); |
127 | 141 | assert_eq!(ncs.as_ref(), None); |
128 | 142 |
|
129 | | - let nms: *mut [u8] = slice::from_raw_parts_mut(null_mut(), 0); |
| 143 | + let nms: *mut [u8] = null_slice(); |
130 | 144 | assert_eq!(nms.as_ref(), None); |
131 | 145 | } |
132 | 146 | } |
@@ -155,7 +169,7 @@ fn test_as_mut() { |
155 | 169 | let mz: *mut [u8] = &mut []; |
156 | 170 | assert_eq!(mz.as_mut(), Some(&mut [][..])); |
157 | 171 |
|
158 | | - let nms: *mut [u8] = slice::from_raw_parts_mut(null_mut(), 0); |
| 172 | + let nms: *mut [u8] = null_slice(); |
159 | 173 | assert_eq!(nms.as_mut(), None); |
160 | 174 | } |
161 | 175 | } |
|
0 commit comments