| //@only-target: x86_64-unknown-linux-gnu i686-unknown-linux-gnu |
| //@compile-flags: -Zmiri-native-lib-enable-tracing |
| |
| extern "C" { |
| fn init_n(n: i32, ptr: *mut u8); |
| } |
| |
| fn main() { |
| partial_init(); |
| } |
| |
| // Initialise the first 2 elements of the slice from native code, and check |
| // that the 3rd is correctly deemed uninit. |
| fn partial_init() { |
| let mut slice = std::mem::MaybeUninit::<[u8; 3]>::uninit(); |
| let slice_ptr = slice.as_mut_ptr().cast::<u8>(); |
| unsafe { |
| // Initialize the first two elements. |
| init_n(2, slice_ptr); |
| assert!(*slice_ptr == 0); |
| assert!(*slice_ptr.offset(1) == 0); |
| // Reading the third is UB! |
| let _val = *slice_ptr.offset(2); //~ ERROR: /Undefined Behavior: reading memory.*, but memory is uninitialized/ |
| } |
| } |