diff options
| author | Oliver Scherer <github35764891676564198441@oli-obk.de> | 2018-10-22 15:45:03 +0200 |
|---|---|---|
| committer | Oliver Scherer <github35764891676564198441@oli-obk.de> | 2018-10-29 13:14:17 +0100 |
| commit | e70b63458aafdc0f0e2e350c72317e53b0afa71d (patch) | |
| tree | 0aca743102f430b8d341a7560c344f278babb3e7 | |
| parent | 4e88b7363b7858960ccfd87326ece9d00bf4d973 (diff) | |
| download | rust-e70b63458aafdc0f0e2e350c72317e53b0afa71d.tar.gz rust-e70b63458aafdc0f0e2e350c72317e53b0afa71d.zip | |
Turn ICE for dangling pointers into error
| -rw-r--r-- | src/librustc_mir/interpret/memory.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/consts/dangling-alloc-id-ice.rs | 15 | ||||
| -rw-r--r-- | src/test/ui/consts/dangling-alloc-id-ice.stderr | 13 | ||||
| -rw-r--r-- | src/test/ui/consts/dangling_raw_ptr.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/consts/dangling_raw_ptr.stderr | 13 |
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 + |
