Skip to content

Commit 521e77d

Browse files
committed
test that we properly check dynamic alignment
1 parent 216e686 commit 521e77d

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// should find the bug even without these
2+
// compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows
3+
4+
#[repr(align(256))]
5+
#[derive(Debug)]
6+
struct MuchAlign;
7+
8+
fn main() {
9+
let buf = [0u32; 256];
10+
// `buf` is sufficiently aligned for `layout.align` on a `dyn Debug`, but not
11+
// for the actual alignment required by `MuchAlign`.
12+
// We craft a wide reference `&dyn Debug` with the vtable for `MuchAlign`. That should be UB,
13+
// as the reference is not aligned to its dynamic alignment requirements.
14+
let mut ptr = &MuchAlign as &dyn std::fmt::Debug;
15+
// Overwrite the data part of `ptr`.
16+
unsafe { (&mut ptr as *mut _ as *mut *const u8).write(&buf as *const _ as *const u8); }
17+
// Re-borrow that. This should be UB.
18+
let _ptr = &*ptr; //~ ERROR accessing memory with alignment 4, but alignment 256 is required
19+
}

0 commit comments

Comments
 (0)