From b5719720220af47f3796cb5147b91956022f5450 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 30 Oct 2023 08:23:37 +0100 Subject: [PATCH] make sure we catch UB with _ pattern in various syntactic positions --- ...angling_pointer_project_underscore_let.rs} | 0 ...ing_pointer_project_underscore_let.stderr} | 8 +++--- ..._project_underscore_let_type_annotation.rs | 12 +++++++++ ...ject_underscore_let_type_annotation.stderr | 25 +++++++++++++++++++ ...ngling_pointer_project_underscore_match.rs | 15 +++++++++++ ...ng_pointer_project_underscore_match.stderr | 25 +++++++++++++++++++ 6 files changed, 81 insertions(+), 4 deletions(-) rename tests/fail/dangling_pointers/{dangling_pointer_project_underscore.rs => dangling_pointer_project_underscore_let.rs} (100%) rename tests/fail/dangling_pointers/{dangling_pointer_project_underscore.stderr => dangling_pointer_project_underscore_let.stderr} (82%) create mode 100644 tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs create mode 100644 tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr create mode 100644 tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs create mode 100644 tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr diff --git a/tests/fail/dangling_pointers/dangling_pointer_project_underscore.rs b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.rs similarity index 100% rename from tests/fail/dangling_pointers/dangling_pointer_project_underscore.rs rename to tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.rs diff --git a/tests/fail/dangling_pointers/dangling_pointer_project_underscore.stderr b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.stderr similarity index 82% rename from tests/fail/dangling_pointers/dangling_pointer_project_underscore.stderr rename to tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.stderr index 20f3a25a0b..16841626dc 100644 --- a/tests/fail/dangling_pointers/dangling_pointer_project_underscore.stderr +++ b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.stderr @@ -1,5 +1,5 @@ error: Undefined Behavior: out-of-bounds pointer arithmetic: ALLOC has been freed, so this pointer is dangling - --> $DIR/dangling_pointer_project_underscore.rs:LL:CC + --> $DIR/dangling_pointer_project_underscore_let.rs:LL:CC | LL | let _ = (*p).1; | ^^^^^^ out-of-bounds pointer arithmetic: ALLOC has been freed, so this pointer is dangling @@ -7,17 +7,17 @@ LL | let _ = (*p).1; = 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 help: ALLOC was allocated here: - --> $DIR/dangling_pointer_project_underscore.rs:LL:CC + --> $DIR/dangling_pointer_project_underscore_let.rs:LL:CC | LL | let b = Box::new(42); | ^^^^^^^^^^^^ help: ALLOC was deallocated here: - --> $DIR/dangling_pointer_project_underscore.rs:LL:CC + --> $DIR/dangling_pointer_project_underscore_let.rs:LL:CC | LL | }; | ^ = note: BACKTRACE (of the first span): - = note: inside `main` at $DIR/dangling_pointer_project_underscore.rs:LL:CC + = note: inside `main` at $DIR/dangling_pointer_project_underscore_let.rs:LL:CC note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs new file mode 100644 index 0000000000..fc10a826c1 --- /dev/null +++ b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs @@ -0,0 +1,12 @@ +// Make sure we find these even with many checks disabled. +//@compile-flags: -Zmiri-disable-alignment-check -Zmiri-disable-stacked-borrows -Zmiri-disable-validation + +fn main() { + let p = { + let b = Box::new(42); + &*b as *const i32 as *const (u8, u8, u8, u8) + }; + unsafe { + let _: u8 = (*p).1; //~ ERROR: out-of-bounds pointer arithmetic + } +} diff --git a/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr new file mode 100644 index 0000000000..0cdb6639a2 --- /dev/null +++ b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr @@ -0,0 +1,25 @@ +error: Undefined Behavior: out-of-bounds pointer arithmetic: ALLOC has been freed, so this pointer is dangling + --> $DIR/dangling_pointer_project_underscore_let_type_annotation.rs:LL:CC + | +LL | let _: u8 = (*p).1; + | ^^^^^^ out-of-bounds pointer arithmetic: ALLOC has been freed, so this pointer is dangling + | + = 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 +help: ALLOC was allocated here: + --> $DIR/dangling_pointer_project_underscore_let_type_annotation.rs:LL:CC + | +LL | let b = Box::new(42); + | ^^^^^^^^^^^^ +help: ALLOC was deallocated here: + --> $DIR/dangling_pointer_project_underscore_let_type_annotation.rs:LL:CC + | +LL | }; + | ^ + = note: BACKTRACE (of the first span): + = note: inside `main` at $DIR/dangling_pointer_project_underscore_let_type_annotation.rs:LL:CC + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to previous error + diff --git a/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs new file mode 100644 index 0000000000..8541da8485 --- /dev/null +++ b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs @@ -0,0 +1,15 @@ +// Make sure we find these even with many checks disabled. +//@compile-flags: -Zmiri-disable-alignment-check -Zmiri-disable-stacked-borrows -Zmiri-disable-validation + +fn main() { + let p = { + let b = Box::new(42); + &*b as *const i32 as *const (u8, u8, u8, u8) + }; + unsafe { + match (*p).1 { + //~^ ERROR: out-of-bounds pointer arithmetic + _ => {} + } + } +} diff --git a/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr new file mode 100644 index 0000000000..625a7b5f60 --- /dev/null +++ b/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr @@ -0,0 +1,25 @@ +error: Undefined Behavior: out-of-bounds pointer arithmetic: ALLOC has been freed, so this pointer is dangling + --> $DIR/dangling_pointer_project_underscore_match.rs:LL:CC + | +LL | match (*p).1 { + | ^^^^^^ out-of-bounds pointer arithmetic: ALLOC has been freed, so this pointer is dangling + | + = 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 +help: ALLOC was allocated here: + --> $DIR/dangling_pointer_project_underscore_match.rs:LL:CC + | +LL | let b = Box::new(42); + | ^^^^^^^^^^^^ +help: ALLOC was deallocated here: + --> $DIR/dangling_pointer_project_underscore_match.rs:LL:CC + | +LL | }; + | ^ + = note: BACKTRACE (of the first span): + = note: inside `main` at $DIR/dangling_pointer_project_underscore_match.rs:LL:CC + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to previous error +