1 //@error-pattern: memory is uninitialized at [0x4..0x8]
2 //@normalize-stderr-test: "a[0-9]+" -> "ALLOC"
3 #![feature(strict_provenance)]
5 // Test printing allocations that contain single-byte provenance.
7 use std::alloc::{alloc, dealloc, Layout};
8 use std::mem::{self, MaybeUninit};
9 use std::slice::from_raw_parts;
11 fn byte_with_provenance<T>(val: u8, prov: *const T) -> MaybeUninit<u8> {
12 let ptr = prov.with_addr(val as usize);
13 let bytes: [MaybeUninit<u8>; mem::size_of::<*const ()>()] = unsafe { mem::transmute(ptr) };
14 let lsb = if cfg!(target_endian = "little") { 0 } else { bytes.len() - 1 };
19 let layout = Layout::from_size_align(16, 8).unwrap();
21 let ptr = alloc(layout);
22 let ptr_raw = ptr.cast::<MaybeUninit<u8>>();
23 *ptr_raw.add(0) = byte_with_provenance(0x42, &42u8);
26 *ptr_raw.add(3) = byte_with_provenance(0x43, &0u8);
27 let slice1 = from_raw_parts(ptr, 8);
28 let slice2 = from_raw_parts(ptr.add(8), 8);
29 drop(slice1.cmp(slice2));