]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs
Rollup merge of #104627 - calebzulawski:print-target-features, r=compiler-errors
[rust.git] / src / tools / miri / tests / fail / uninit_buffer_with_provenance.rs
1 //@error-pattern: memory is uninitialized at [0x4..0x8]
2 //@normalize-stderr-test: "a[0-9]+" -> "ALLOC"
3 #![feature(strict_provenance)]
4
5 // Test printing allocations that contain single-byte provenance.
6
7 use std::alloc::{alloc, dealloc, Layout};
8 use std::mem::{self, MaybeUninit};
9 use std::slice::from_raw_parts;
10
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 };
15     bytes[lsb]
16 }
17
18 fn main() {
19     let layout = Layout::from_size_align(16, 8).unwrap();
20     unsafe {
21         let ptr = alloc(layout);
22         let ptr_raw = ptr.cast::<MaybeUninit<u8>>();
23         *ptr_raw.add(0) = byte_with_provenance(0x42, &42u8);
24         *ptr.add(1) = 0x12;
25         *ptr.add(2) = 0x13;
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));
30         dealloc(ptr, layout);
31     }
32 }