|
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