From e70b63458aafdc0f0e2e350c72317e53b0afa71d Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Mon, 22 Oct 2018 15:45:03 +0200 Subject: [PATCH] Turn ICE for dangling pointers into error --- src/librustc_mir/interpret/memory.rs | 5 +++++ src/test/ui/consts/dangling-alloc-id-ice.rs | 15 +++++++++++++++ src/test/ui/consts/dangling-alloc-id-ice.stderr | 13 +++++++++++++ src/test/ui/consts/dangling_raw_ptr.rs | 10 ++++++++++ src/test/ui/consts/dangling_raw_ptr.stderr | 13 +++++++++++++ 5 files changed, 56 insertions(+) create mode 100644 src/test/ui/consts/dangling-alloc-id-ice.rs create mode 100644 src/test/ui/consts/dangling-alloc-id-ice.stderr create mode 100644 src/test/ui/consts/dangling_raw_ptr.rs create mode 100644 src/test/ui/consts/dangling_raw_ptr.stderr diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index 689a29cff6e9e..c2fb9e9608493 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 0000000000000..695d33b690898 --- /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 0000000000000..a5fa88e5e6832 --- /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 0000000000000..7fc773412f2f8 --- /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 0000000000000..3b20936f8ae97 --- /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 +