Skip to content

Commit

Permalink
add test for intermediate reference in '&(*x).0 as *const i32'
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Jul 14, 2024
1 parent 6f65362 commit 9a23878
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#![feature(raw_ref_op)]
#![feature(strict_provenance)]
use std::ptr;

fn direct_raw(x: *const (i32, i32)) -> *const i32 {
unsafe { &raw const (*x).0 }
}

// Ensure that if a raw pointer is created via an intermediate
// reference, we catch that. (Just in case someone decides to
// desugar this differenly or so.)
fn via_ref(x: *const (i32, i32)) -> *const i32 {
unsafe { &(*x).0 as *const i32 } //~ERROR: dangling pointer
}

fn main() {
let ptr = ptr::without_provenance(0x10);
direct_raw(ptr); // this is fine
via_ref(ptr); // this is not
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error: Undefined Behavior: out-of-bounds pointer use: 0x10[noalloc] is a dangling pointer (it has no provenance)
--> $DIR/dangling_pointer_to_raw_pointer.rs:LL:CC
|
LL | unsafe { &(*x).0 as *const i32 }
| ^^^^^^^ out-of-bounds pointer use: 0x10[noalloc] is a dangling pointer (it has no provenance)
|
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
= note: BACKTRACE:
= note: inside `via_ref` at $DIR/dangling_pointer_to_raw_pointer.rs:LL:CC
note: inside `main`
--> $DIR/dangling_pointer_to_raw_pointer.rs:LL:CC
|
LL | via_ref(ptr); // this is not
| ^^^^^^^^^^^^

note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace

error: aborting due to 1 previous error

0 comments on commit 9a23878

Please sign in to comment.