From a0de0061cdf3b445f9748c2b1cbdb9bcacd85f6a 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 +++++++++++++++++++ tests/pass/underscore_pattern.rs | 17 +++++-------- tests/pass/underscore_pattern.stdout | 1 - 8 files changed, 87 insertions(+), 16 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 delete mode 100644 tests/pass/underscore_pattern.stdout 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 + diff --git a/tests/pass/underscore_pattern.rs b/tests/pass/underscore_pattern.rs index f9b42c5bc8..b0e85bc1bb 100644 --- a/tests/pass/underscore_pattern.rs +++ b/tests/pass/underscore_pattern.rs @@ -3,15 +3,15 @@ use std::ptr; fn main() { - dangling_deref_match(); - union_uninhabited_match(); + dangling_match(); + invalid_match(); dangling_let(); invalid_let(); dangling_let_type_annotation(); invalid_let_type_annotation(); } -fn dangling_deref_match() { +fn dangling_match() { let p = { let b = Box::new(42); &*b as *const i32 @@ -23,20 +23,15 @@ fn dangling_deref_match() { } } -fn union_uninhabited_match() { - #[derive(Copy, Clone)] - enum Void {} +fn invalid_match() { union Uninit { value: T, uninit: (), } unsafe { - let x: Uninit = Uninit { uninit: () }; + let x: Uninit = Uninit { uninit: () }; match x.value { - // rustc warns about un unreachable pattern, - // but is wrong in unsafe code. - #[allow(unreachable_patterns)] - _ => println!("hi from the void!"), + _ => {} } } } diff --git a/tests/pass/underscore_pattern.stdout b/tests/pass/underscore_pattern.stdout deleted file mode 100644 index ff731696f0..0000000000 --- a/tests/pass/underscore_pattern.stdout +++ /dev/null @@ -1 +0,0 @@ -hi from the void!