+// error-pattern: but alignment 4 is required
+
fn main() {
let mut x = [0u8; 20];
let x_ptr: *mut u8 = x.as_mut_ptr();
// At least one of these is definitely unaligned.
- // Currently, we guarantee to complain about the first one already (https://github.com/rust-lang/miri/issues/1074).
unsafe {
- *(x_ptr as *mut u64) = 42; //~ ERROR accessing memory with alignment 1, but alignment
- *(x_ptr.add(1) as *mut u64) = 42;
+ *(x_ptr as *mut u32) = 42;
+ *(x_ptr.add(1) as *mut u32) = 42;
}
- panic!("unreachable in miri");
}
}
fn main() {
- let foo = Foo {
- x: 42,
- y: 99,
- };
- let p = unsafe { &foo.x };
- let i = *p; //~ ERROR alignment 4 is required
+ for _ in 0..10 { // Try many times as this might work by chance.
+ let foo = Foo {
+ x: 42,
+ y: 99,
+ };
+ let p = unsafe { &foo.x };
+ let i = *p; //~ ERROR alignment 4 is required
+ }
}
// compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows
fn main() {
- let x = [2u16, 3, 4]; // Make it big enough so we don't get an out-of-bounds error.
- let x = &x[0] as *const _ as *const u32;
- // This must fail because alignment is violated: the allocation's base is not sufficiently aligned.
- let _x = unsafe { *x }; //~ ERROR memory with alignment 2, but alignment 4 is required
+ for _ in 0..10 { // Try many times as this might work by chance.
+ let x = [2u16, 3, 4]; // Make it big enough so we don't get an out-of-bounds error.
+ let x = &x[0] as *const _ as *const u32;
+ // This must fail because alignment is violated: the allocation's base is not sufficiently aligned.
+ let _x = unsafe { *x }; //~ ERROR memory with alignment 2, but alignment 4 is required
+ }
}
// compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows
fn main() {
- let x = [2u32, 3]; // Make it big enough so we don't get an out-of-bounds error.
- let x = (x.as_ptr() as *const u8).wrapping_offset(3) as *const u32;
- // This must fail because alignment is violated: the offset is not sufficiently aligned.
- // Also make the offset not a power of 2, that used to ICE.
- let _x = unsafe { *x }; //~ ERROR memory with alignment 1, but alignment 4 is required
+ for _ in 0..10 { // Try many times as this might work by chance.
+ let x = [2u32, 3]; // Make it big enough so we don't get an out-of-bounds error.
+ let x = (x.as_ptr() as *const u8).wrapping_offset(3) as *const u32;
+ // This must fail because alignment is violated: the offset is not sufficiently aligned.
+ // Also make the offset not a power of 2, that used to ICE.
+ let _x = unsafe { *x }; //~ ERROR memory with alignment 1, but alignment 4 is required
+ }
}
// compile-flags: -Zmiri-disable-validation -Zmiri-disable-stacked-borrows
fn main() {
- let x = [2u16, 3, 4, 5]; // Make it big enough so we don't get an out-of-bounds error.
- let x = &x[0] as *const _ as *const *const u8; // cast to ptr-to-ptr, so that we load a ptr
- // This must fail because alignment is violated. Test specifically for loading pointers,
- // which have special code in miri's memory.
- let _x = unsafe { *x };
- //~^ ERROR memory with alignment 2, but alignment
+ for _ in 0..10 { // Try many times as this might work by chance.
+ let x = [2u16, 3, 4, 5]; // Make it big enough so we don't get an out-of-bounds error.
+ let x = &x[0] as *const _ as *const *const u8; // cast to ptr-to-ptr, so that we load a ptr
+ // This must fail because alignment is violated. Test specifically for loading pointers,
+ // which have special code in miri's memory.
+ let _x = unsafe { *x };
+ //~^ ERROR but alignment
+ }
}
use std::ptr;
fn main() {
- let x = [2u16, 3, 4]; // Make it big enough so we don't get an out-of-bounds error.
- let x = &x[0] as *const _ as *const u32;
- // This must fail because alignment is violated: the allocation's base is not sufficiently aligned.
- // The deref is UB even if we just put the result into a raw pointer.
- let _x = unsafe { ptr::raw_const!(*x) }; //~ ERROR memory with alignment 2, but alignment 4 is required
+ for _ in 0..10 { // Try many times as this might work by chance.
+ let x = [2u16, 3, 4]; // Make it big enough so we don't get an out-of-bounds error.
+ let x = &x[0] as *const _ as *const u32;
+ // This must fail because alignment is violated: the allocation's base is not sufficiently aligned.
+ // The deref is UB even if we just put the result into a raw pointer.
+ let _x = unsafe { ptr::raw_const!(*x) }; //~ ERROR memory with alignment 2, but alignment 4 is required
+ }
}