about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2017-07-19 11:28:35 -0700
committerRalf Jung <post@ralfj.de>2017-07-19 11:28:35 -0700
commit72664e42aa1f66ac57891cc45f80cc925e261c19 (patch)
treeb8aba122fc516d1affae3b27b1f8e2f04e7531c5
parent2d5c4196f17fc8d09ac2c434f2a49cdb07e7f4bc (diff)
downloadrust-72664e42aa1f66ac57891cc45f80cc925e261c19.tar.gz
rust-72664e42aa1f66ac57891cc45f80cc925e261c19.zip
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.
-rw-r--r--src/eval_context.rs4
-rw-r--r--tests/compile-fail/int_ptr_cast.rs5
-rw-r--r--tests/compile-fail/int_ptr_cast2.rs5
-rw-r--r--tests/compile-fail/reference_to_packed.rs4
-rw-r--r--tests/compile-fail/unaligned_ptr_cast.rs2
5 files changed, 3 insertions, 17 deletions
diff --git a/src/eval_context.rs b/src/eval_context.rs
index 2f28063ff86..ff09e5db949 100644
--- a/src/eval_context.rs
+++ b/src/eval_context.rs
@@ -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)?;
             }
 
diff --git a/tests/compile-fail/int_ptr_cast.rs b/tests/compile-fail/int_ptr_cast.rs
deleted file mode 100644
index ae5f65a7166..00000000000
--- a/tests/compile-fail/int_ptr_cast.rs
+++ /dev/null
@@ -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
-}
diff --git a/tests/compile-fail/int_ptr_cast2.rs b/tests/compile-fail/int_ptr_cast2.rs
deleted file mode 100644
index 1897066f7bc..00000000000
--- a/tests/compile-fail/int_ptr_cast2.rs
+++ /dev/null
@@ -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
-}
diff --git a/tests/compile-fail/reference_to_packed.rs b/tests/compile-fail/reference_to_packed.rs
index 4cf353298b9..5ca733a64df 100644
--- a/tests/compile-fail/reference_to_packed.rs
+++ b/tests/compile-fail/reference_to_packed.rs
@@ -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
 }
diff --git a/tests/compile-fail/unaligned_ptr_cast.rs b/tests/compile-fail/unaligned_ptr_cast.rs
index fcab430f8fc..8ad1b323250 100644
--- a/tests/compile-fail/unaligned_ptr_cast.rs
+++ b/tests/compile-fail/unaligned_ptr_cast.rs
@@ -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
 }