about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-10-30 07:33:31 +0000
committerbors <bors@rust-lang.org>2023-10-30 07:33:31 +0000
commitde09bf55e3752dd2e87d74ba0ffc62718e0ef118 (patch)
tree9cffdd4841eae9dddf48f3d16dc6ddb902770b44 /src
parent2c9baab7fd18e882f2c3e3af6e45c566f4a2fc25 (diff)
parent98eb384eab9cf12d39b76689b89264b4e929f587 (diff)
downloadrust-de09bf55e3752dd2e87d74ba0ffc62718e0ef118.tar.gz
rust-de09bf55e3752dd2e87d74ba0ffc62718e0ef118.zip
Auto merge of #3150 - RalfJung:undercore-match, r=RalfJung
make sure we catch UB in match place even with _ pattern

Fixes https://github.com/rust-lang/miri/issues/2360
Diffstat (limited to 'src')
-rw-r--r--src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.rs (renamed from src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore.rs)0
-rw-r--r--src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.stderr (renamed from src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore.stderr)8
-rw-r--r--src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs12
-rw-r--r--src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr25
-rw-r--r--src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs15
-rw-r--r--src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr25
-rw-r--r--src/tools/miri/tests/pass/underscore_pattern.rs17
-rw-r--r--src/tools/miri/tests/pass/underscore_pattern.stdout1
8 files changed, 87 insertions, 16 deletions
diff --git a/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore.rs b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.rs
index 22a5ce8ea74..22a5ce8ea74 100644
--- a/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore.rs
+++ b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.rs
diff --git a/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore.stderr b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let.stderr
index 20f3a25a0b1..16841626dc2 100644
--- a/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore.stderr
+++ b/src/tools/miri/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/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.rs
new file mode 100644
index 00000000000..fc10a826c1e
--- /dev/null
+++ b/src/tools/miri/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/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_let_type_annotation.stderr
new file mode 100644
index 00000000000..0cdb6639a2f
--- /dev/null
+++ b/src/tools/miri/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/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.rs
new file mode 100644
index 00000000000..8541da84857
--- /dev/null
+++ b/src/tools/miri/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/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr b/src/tools/miri/tests/fail/dangling_pointers/dangling_pointer_project_underscore_match.stderr
new file mode 100644
index 00000000000..625a7b5f60b
--- /dev/null
+++ b/src/tools/miri/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/src/tools/miri/tests/pass/underscore_pattern.rs b/src/tools/miri/tests/pass/underscore_pattern.rs
index f9b42c5bc8e..b0e85bc1bb0 100644
--- a/src/tools/miri/tests/pass/underscore_pattern.rs
+++ b/src/tools/miri/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<T: Copy> {
         value: T,
         uninit: (),
     }
     unsafe {
-        let x: Uninit<Void> = Uninit { uninit: () };
+        let x: Uninit<bool> = 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/src/tools/miri/tests/pass/underscore_pattern.stdout b/src/tools/miri/tests/pass/underscore_pattern.stdout
deleted file mode 100644
index ff731696f01..00000000000
--- a/src/tools/miri/tests/pass/underscore_pattern.stdout
+++ /dev/null
@@ -1 +0,0 @@
-hi from the void!