From 069d8fdb71a9a46a76552e8eea7d427b4d6f08a1 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 5 Jun 2022 12:25:46 -0400 Subject: [PATCH] test for Stacked Borrows error during vtable validation --- tests/fail/stacked_borrows/vtable.rs | 19 ++++++++++++++++++ tests/fail/stacked_borrows/vtable.stderr | 25 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 tests/fail/stacked_borrows/vtable.rs create mode 100644 tests/fail/stacked_borrows/vtable.stderr diff --git a/tests/fail/stacked_borrows/vtable.rs b/tests/fail/stacked_borrows/vtable.rs new file mode 100644 index 00000000000..dd9ba1dfb2b --- /dev/null +++ b/tests/fail/stacked_borrows/vtable.rs @@ -0,0 +1,19 @@ +// error-pattern: vtable pointer does not have permission +#![feature(ptr_metadata)] + +trait Foo {} + +impl Foo for u32 {} + +fn uwu(thin: *const (), meta: &'static ()) -> *const dyn Foo { + core::ptr::from_raw_parts(thin, unsafe { core::mem::transmute(meta) }) +} + +fn main() { + unsafe { + let orig = 1_u32; + let x = &orig as &dyn Foo; + let (ptr, meta) = (x as *const dyn Foo).to_raw_parts(); + let _ = uwu(ptr, core::mem::transmute(meta)); + } +} diff --git a/tests/fail/stacked_borrows/vtable.stderr b/tests/fail/stacked_borrows/vtable.stderr new file mode 100644 index 00000000000..ac3d71045f0 --- /dev/null +++ b/tests/fail/stacked_borrows/vtable.stderr @@ -0,0 +1,25 @@ +error: Undefined Behavior: type validation failed: encountered vtable pointer does not have permission to read drop function pointer + --> RUSTLIB/core/src/ptr/metadata.rs:LL:CC + | +LL | unsafe { PtrRepr { components: PtrComponents { data_address, metadata } }.const_ptr } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered vtable pointer does not have permission to read drop function pointer + | + = 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: inside `std::ptr::from_raw_parts::` at RUSTLIB/core/src/ptr/metadata.rs:LL:CC +note: inside `uwu` at $DIR/vtable.rs:LL:CC + --> $DIR/vtable.rs:LL:CC + | +LL | core::ptr::from_raw_parts(thin, unsafe { core::mem::transmute(meta) }) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +note: inside `main` at $DIR/vtable.rs:LL:CC + --> $DIR/vtable.rs:LL:CC + | +LL | let _ = uwu(ptr, core::mem::transmute(meta)); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to previous error +