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:
parent
2d5c4196f1
commit
72664e42aa
5 changed files with 3 additions and 17 deletions
|
|
@ -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)?;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue