about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Scherer <github35764891676564198441@oli-obk.de>2018-10-22 15:45:03 +0200
committerOliver Scherer <github35764891676564198441@oli-obk.de>2018-10-29 13:14:17 +0100
commite70b63458aafdc0f0e2e350c72317e53b0afa71d (patch)
tree0aca743102f430b8d341a7560c344f278babb3e7
parent4e88b7363b7858960ccfd87326ece9d00bf4d973 (diff)
downloadrust-e70b63458aafdc0f0e2e350c72317e53b0afa71d.tar.gz
rust-e70b63458aafdc0f0e2e350c72317e53b0afa71d.zip
Turn ICE for dangling pointers into error
-rw-r--r--src/librustc_mir/interpret/memory.rs5
-rw-r--r--src/test/ui/consts/dangling-alloc-id-ice.rs15
-rw-r--r--src/test/ui/consts/dangling-alloc-id-ice.stderr13
-rw-r--r--src/test/ui/consts/dangling_raw_ptr.rs10
-rw-r--r--src/test/ui/consts/dangling_raw_ptr.stderr13
5 files changed, 56 insertions, 0 deletions
diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs
index 689a29cff6e..c2fb9e96084 100644
--- a/src/librustc_mir/interpret/memory.rs
+++ b/src/librustc_mir/interpret/memory.rs
@@ -737,6 +737,11 @@ where
             if self.alloc_map.contains_key(&alloc) {
                 // Not yet interned, so proceed recursively
                 self.intern_static(alloc, mutability)?;
+            } else if self.dead_alloc_map.contains_key(&alloc) {
+                // dangling pointer
+                return err!(ValidationFailure(
+                    "encountered dangling pointer in final constant".into(),
+                ))
             }
         }
         Ok(())
diff --git a/src/test/ui/consts/dangling-alloc-id-ice.rs b/src/test/ui/consts/dangling-alloc-id-ice.rs
new file mode 100644
index 00000000000..695d33b6908
--- /dev/null
+++ b/src/test/ui/consts/dangling-alloc-id-ice.rs
@@ -0,0 +1,15 @@
+// https://github.com/rust-lang/rust/issues/55223
+
+#![feature(const_let)]
+
+union Foo<'a> {
+    y: &'a (),
+    long_live_the_unit: &'static (),
+}
+
+const FOO: &() = { //~ ERROR any use of this value will cause an error
+    let y = ();
+    unsafe { Foo { y: &y }.long_live_the_unit }
+};
+
+fn main() {}
diff --git a/src/test/ui/consts/dangling-alloc-id-ice.stderr b/src/test/ui/consts/dangling-alloc-id-ice.stderr
new file mode 100644
index 00000000000..a5fa88e5e68
--- /dev/null
+++ b/src/test/ui/consts/dangling-alloc-id-ice.stderr
@@ -0,0 +1,13 @@
+error: any use of this value will cause an error
+  --> $DIR/dangling-alloc-id-ice.rs:10:1
+   |
+LL | / const FOO: &() = { //~ ERROR any use of this value will cause an error
+LL | |     let y = ();
+LL | |     unsafe { Foo { y: &y }.long_live_the_unit }
+LL | | };
+   | |__^ type validation failed: encountered dangling pointer in final constant
+   |
+   = note: #[deny(const_err)] on by default
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/consts/dangling_raw_ptr.rs b/src/test/ui/consts/dangling_raw_ptr.rs
new file mode 100644
index 00000000000..7fc773412f2
--- /dev/null
+++ b/src/test/ui/consts/dangling_raw_ptr.rs
@@ -0,0 +1,10 @@
+#![feature(const_let)]
+
+const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
+    let x = 42;
+    &x
+};
+
+fn main() {
+    let x = FOO;
+}
diff --git a/src/test/ui/consts/dangling_raw_ptr.stderr b/src/test/ui/consts/dangling_raw_ptr.stderr
new file mode 100644
index 00000000000..3b20936f8ae
--- /dev/null
+++ b/src/test/ui/consts/dangling_raw_ptr.stderr
@@ -0,0 +1,13 @@
+error: any use of this value will cause an error
+  --> $DIR/dangling_raw_ptr.rs:3:1
+   |
+LL | / const FOO: *const u32 = { //~ ERROR any use of this value will cause an error
+LL | |     let x = 42;
+LL | |     &x
+LL | | };
+   | |__^ type validation failed: encountered dangling pointer in final constant
+   |
+   = note: #[deny(const_err)] on by default
+
+error: aborting due to previous error
+