rust/tests/compile-fail/unaligned_pointers/dyn_alignment.rs

20 lines
856 B
Rust
Raw Normal View History

// should find the bug even without these
// compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows
#[repr(align(256))]
#[derive(Debug)]
struct MuchAlign;
fn main() {
let buf = [0u32; 256];
// `buf` is sufficiently aligned for `layout.align` on a `dyn Debug`, but not
// for the actual alignment required by `MuchAlign`.
// We craft a wide reference `&dyn Debug` with the vtable for `MuchAlign`. That should be UB,
// as the reference is not aligned to its dynamic alignment requirements.
let mut ptr = &MuchAlign as &dyn std::fmt::Debug;
// Overwrite the data part of `ptr`.
unsafe { (&mut ptr as *mut _ as *mut *const u8).write(&buf as *const _ as *const u8); }
// Re-borrow that. This should be UB.
let _ptr = &*ptr; //~ ERROR accessing memory with alignment 4, but alignment 256 is required
}