No longer check aligment and non-NULLness on &

This breaks creating unaligned raw pointers via `&packed.field as *const _`, which needs to be legal.
Also it doesn't seem like LLVM still relies on this, see
* https://github.com/solson/miri/issues/244#issuecomment-315563640
* https://internals.rust-lang.org/t/rules-for-alignment-and-non-nullness-of-references/5430/16

We probably want to handle this invariant like the others that validation is concerned with, and only
check it on function boundaries for now.
This commit is contained in:
Ralf Jung 2017-07-19 11:28:35 -07:00
parent 2d5c4196f1
commit 72664e42aa
5 changed files with 3 additions and 17 deletions

View file

@ -682,10 +682,6 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
bug!("attempted to take a reference to an enum downcast lvalue"),
};
// Check alignment and non-NULLness.
let (_, align) = self.size_and_align_of_dst(ty, val)?;
self.memory.check_align(ptr, align)?;
self.write_value(val, dest, dest_ty)?;
}

View file

@ -1,5 +0,0 @@
fn main() {
let x = 2usize as *const u32;
// This must fail because alignment is violated
let _ = unsafe { &*x }; //~ ERROR: tried to access memory with alignment 2, but alignment 4 is required
}

View file

@ -1,5 +0,0 @@
fn main() {
let x = 0usize as *const u32;
// This must fail because the pointer is NULL
let _ = unsafe { &*x }; //~ ERROR: invalid use of NULL pointer
}

View file

@ -11,6 +11,6 @@ fn main() {
x: 42,
y: 99,
};
let p = &foo.x; //~ ERROR tried to access memory with alignment 1, but alignment 4 is required
let i = *p;
let p = &foo.x;
let i = *p; //~ ERROR tried to access memory with alignment 1, but alignment 4 is required
}

View file

@ -2,5 +2,5 @@ fn main() {
let x = &2u16;
let x = x as *const _ as *const u32;
// This must fail because alignment is violated
let _ = unsafe { &*x }; //~ ERROR: tried to access memory with alignment 2, but alignment 4 is required
let _x = unsafe { *x }; //~ ERROR: tried to access memory with alignment 2, but alignment 4 is required
}