diff options
48 files changed, 115 insertions, 35 deletions
diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index 52deba9108c..c1365995737 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -52,7 +52,7 @@ fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> R mode, program: miri_path(), quiet: false, - edition: Some("2018".into()), + edition: Some("2021".into()), ..Config::default() }; diff --git a/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_few_args.stderr b/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_few_args.stderr index 94463bef8f0..c2de4afd68f 100644 --- a/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_few_args.stderr +++ b/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_few_args.stderr @@ -7,8 +7,8 @@ LL | panic!() = 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 `thread_start` at RUSTLIB/std/src/panic.rs:LL:CC - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: inside `thread_start` at RUSTLIB/core/src/panic.rs:LL:CC + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error diff --git a/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_many_args.stderr b/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_many_args.stderr index fdbe91cc8a8..85ae930d439 100644 --- a/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_many_args.stderr +++ b/src/tools/miri/tests/fail/concurrency/libc_pthread_create_too_many_args.stderr @@ -7,8 +7,8 @@ LL | panic!() = 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 `thread_start` at RUSTLIB/std/src/panic.rs:LL:CC - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: inside `thread_start` at RUSTLIB/core/src/panic.rs:LL:CC + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error diff --git a/src/tools/miri/tests/fail/data_race/alloc_read_race.rs b/src/tools/miri/tests/fail/data_race/alloc_read_race.rs index 2698c63a445..42077dfae2d 100644 --- a/src/tools/miri/tests/fail/data_race/alloc_read_race.rs +++ b/src/tools/miri/tests/fail/data_race/alloc_read_race.rs @@ -26,6 +26,7 @@ pub fn main() { // 2. write unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing // Concurrent allocate the memory. // Uses relaxed semantics to not generate // a release sequence. @@ -34,6 +35,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; // Note: could also error due to reading uninitialized memory, but the data-race detector triggers first. diff --git a/src/tools/miri/tests/fail/data_race/alloc_write_race.rs b/src/tools/miri/tests/fail/data_race/alloc_write_race.rs index b78d5ef27d3..53f4e637a19 100644 --- a/src/tools/miri/tests/fail/data_race/alloc_write_race.rs +++ b/src/tools/miri/tests/fail/data_race/alloc_write_race.rs @@ -25,6 +25,7 @@ pub fn main() { // 2. write unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing // Concurrent allocate the memory. // Uses relaxed semantics to not generate // a release sequence. @@ -34,6 +35,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; *pointer.load(Ordering::Relaxed) = 2; //~ ERROR: Data race detected between (1) Allocate on thread `<unnamed>` and (2) Write on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race1.rs b/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race1.rs index 3f811d0f64d..9606df1d6ff 100644 --- a/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race1.rs +++ b/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race1.rs @@ -16,10 +16,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *(c.0 as *mut usize) = 32; }); let j2 = spawn(move || { + let c = c; // avoid field capturing (&*c.0).load(Ordering::SeqCst) //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Atomic Load on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race2.rs b/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race2.rs index 34fb3ac066f..0e29ab32eef 100644 --- a/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race2.rs +++ b/src/tools/miri/tests/fail/data_race/atomic_read_na_write_race2.rs @@ -17,11 +17,13 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing let atomic_ref = &mut *c.0; atomic_ref.load(Ordering::SeqCst) }); let j2 = spawn(move || { + let c = c; // avoid field capturing let atomic_ref = &mut *c.0; *atomic_ref.get_mut() = 32; //~ ERROR: Data race detected between (1) Atomic Load on thread `<unnamed>` and (2) Write on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race1.rs b/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race1.rs index 63b0806f3bb..6f1792bc8f4 100644 --- a/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race1.rs +++ b/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race1.rs @@ -17,11 +17,13 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing let atomic_ref = &mut *c.0; atomic_ref.store(32, Ordering::SeqCst) }); let j2 = spawn(move || { + let c = c; // avoid field capturing let atomic_ref = &mut *c.0; *atomic_ref.get_mut() //~ ERROR: Data race detected between (1) Atomic Store on thread `<unnamed>` and (2) Read on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race2.rs b/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race2.rs index 9092254be21..e84207e655d 100644 --- a/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race2.rs +++ b/src/tools/miri/tests/fail/data_race/atomic_write_na_read_race2.rs @@ -16,10 +16,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing let _val = *(c.0 as *mut usize); }); let j2 = spawn(move || { + let c = c; // avoid field capturing (&*c.0).store(32, Ordering::SeqCst); //~ ERROR: Data race detected between (1) Read on thread `<unnamed>` and (2) Atomic Store on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race1.rs b/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race1.rs index 5a713905f4e..ca269b1bd2a 100644 --- a/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race1.rs +++ b/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race1.rs @@ -16,10 +16,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *(c.0 as *mut usize) = 32; }); let j2 = spawn(move || { + let c = c; // avoid field capturing (&*c.0).store(64, Ordering::SeqCst); //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Atomic Store on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race2.rs b/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race2.rs index 5848aa262b3..0d69a9a332d 100644 --- a/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race2.rs +++ b/src/tools/miri/tests/fail/data_race/atomic_write_na_write_race2.rs @@ -17,11 +17,13 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing let atomic_ref = &mut *c.0; atomic_ref.store(64, Ordering::SeqCst); }); let j2 = spawn(move || { + let c = c; // avoid field capturing let atomic_ref = &mut *c.0; *atomic_ref.get_mut() = 32; //~ ERROR: Data race detected between (1) Atomic Store on thread `<unnamed>` and (2) Write on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/dangling_thread_async_race.rs b/src/tools/miri/tests/fail/data_race/dangling_thread_async_race.rs index eecb980e905..0679b81f012 100644 --- a/src/tools/miri/tests/fail/data_race/dangling_thread_async_race.rs +++ b/src/tools/miri/tests/fail/data_race/dangling_thread_async_race.rs @@ -18,6 +18,7 @@ fn main() { let join = unsafe { spawn(move || { + let c = c; // capture `c`, not just its field. *c.0 = 32; }) }; @@ -34,6 +35,7 @@ fn main() { let join2 = unsafe { spawn(move || { + let c = c; // capture `c`, not just its field. *c.0 = 64; //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Write on thread `<unnamed>` }) }; diff --git a/src/tools/miri/tests/fail/data_race/dangling_thread_race.rs b/src/tools/miri/tests/fail/data_race/dangling_thread_race.rs index 4c7fbdd7fe6..3c5dd424eb1 100644 --- a/src/tools/miri/tests/fail/data_race/dangling_thread_race.rs +++ b/src/tools/miri/tests/fail/data_race/dangling_thread_race.rs @@ -18,6 +18,7 @@ fn main() { let join = unsafe { spawn(move || { + let c = c; // avoid field capturing *c.0 = 32; }) }; diff --git a/src/tools/miri/tests/fail/data_race/dealloc_read_race1.rs b/src/tools/miri/tests/fail/data_race/dealloc_read_race1.rs index 18593cf56ae..3c25cdc0d8d 100644 --- a/src/tools/miri/tests/fail/data_race/dealloc_read_race1.rs +++ b/src/tools/miri/tests/fail/data_race/dealloc_read_race1.rs @@ -20,10 +20,12 @@ pub fn main() { unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing let _val = *ptr.0; }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing __rust_dealloc( //~^ ERROR: Data race detected between (1) Read on thread `<unnamed>` and (2) Deallocate on thread `<unnamed>` ptr.0 as *mut _, diff --git a/src/tools/miri/tests/fail/data_race/dealloc_read_race2.rs b/src/tools/miri/tests/fail/data_race/dealloc_read_race2.rs index a6f83d489e5..5d7a0cc1dc9 100644 --- a/src/tools/miri/tests/fail/data_race/dealloc_read_race2.rs +++ b/src/tools/miri/tests/fail/data_race/dealloc_read_race2.rs @@ -20,6 +20,7 @@ pub fn main() { unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing __rust_dealloc( ptr.0 as *mut _, std::mem::size_of::<usize>(), @@ -28,6 +29,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing // Also an error of the form: Data race detected between (1) Deallocate on thread `<unnamed>` and (2) Read on thread `<unnamed>` // but the invalid allocation is detected first. *ptr.0 //~ ERROR: dereferenced after this allocation got freed diff --git a/src/tools/miri/tests/fail/data_race/dealloc_read_race_stack.rs b/src/tools/miri/tests/fail/data_race/dealloc_read_race_stack.rs index c82bfed09ee..87b5f204816 100644 --- a/src/tools/miri/tests/fail/data_race/dealloc_read_race_stack.rs +++ b/src/tools/miri/tests/fail/data_race/dealloc_read_race_stack.rs @@ -26,6 +26,7 @@ pub fn main() { // 3. stack-deallocate unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; { let mut stack_var = 0usize; @@ -39,6 +40,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; *pointer.load(Ordering::Acquire) }); diff --git a/src/tools/miri/tests/fail/data_race/dealloc_write_race1.rs b/src/tools/miri/tests/fail/data_race/dealloc_write_race1.rs index 1e93a6cb094..b700f50ce19 100644 --- a/src/tools/miri/tests/fail/data_race/dealloc_write_race1.rs +++ b/src/tools/miri/tests/fail/data_race/dealloc_write_race1.rs @@ -19,10 +19,12 @@ pub fn main() { unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing *ptr.0 = 2; }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing __rust_dealloc( //~^ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Deallocate on thread `<unnamed>` ptr.0 as *mut _, diff --git a/src/tools/miri/tests/fail/data_race/dealloc_write_race2.rs b/src/tools/miri/tests/fail/data_race/dealloc_write_race2.rs index 385584db27f..a7f43f03c02 100644 --- a/src/tools/miri/tests/fail/data_race/dealloc_write_race2.rs +++ b/src/tools/miri/tests/fail/data_race/dealloc_write_race2.rs @@ -19,6 +19,7 @@ pub fn main() { unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing __rust_dealloc( ptr.0 as *mut _, std::mem::size_of::<usize>(), @@ -27,6 +28,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing // Also an error of the form: Data race detected between (1) Deallocate on thread `<unnamed>` and (2) Write on thread `<unnamed>` // but the invalid allocation is detected first. *ptr.0 = 2; //~ ERROR: dereferenced after this allocation got freed diff --git a/src/tools/miri/tests/fail/data_race/dealloc_write_race_stack.rs b/src/tools/miri/tests/fail/data_race/dealloc_write_race_stack.rs index 259fbdc497a..3d35187a018 100644 --- a/src/tools/miri/tests/fail/data_race/dealloc_write_race_stack.rs +++ b/src/tools/miri/tests/fail/data_race/dealloc_write_race_stack.rs @@ -26,6 +26,7 @@ pub fn main() { // 3. stack-deallocate unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; { let mut stack_var = 0usize; @@ -39,6 +40,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; *pointer.load(Ordering::Acquire) = 3; }); diff --git a/src/tools/miri/tests/fail/data_race/enable_after_join_to_main.rs b/src/tools/miri/tests/fail/data_race/enable_after_join_to_main.rs index 3d47b1accb3..b44be4ac64e 100644 --- a/src/tools/miri/tests/fail/data_race/enable_after_join_to_main.rs +++ b/src/tools/miri/tests/fail/data_race/enable_after_join_to_main.rs @@ -26,10 +26,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 32; }); let j2 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 64; //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Write on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/read_write_race.rs b/src/tools/miri/tests/fail/data_race/read_write_race.rs index d996141db3e..aed3ca767f6 100644 --- a/src/tools/miri/tests/fail/data_race/read_write_race.rs +++ b/src/tools/miri/tests/fail/data_race/read_write_race.rs @@ -15,10 +15,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing let _val = *c.0; }); let j2 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 64; //~ ERROR: Data race detected between (1) Read on thread `<unnamed>` and (2) Write on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/read_write_race_stack.rs b/src/tools/miri/tests/fail/data_race/read_write_race_stack.rs index b4e371f430d..40224ced12d 100644 --- a/src/tools/miri/tests/fail/data_race/read_write_race_stack.rs +++ b/src/tools/miri/tests/fail/data_race/read_write_race_stack.rs @@ -31,6 +31,7 @@ pub fn main() { // 5. read-value unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing // Concurrent allocate the memory. // Uses relaxed semantics to not generate // a release sequence. @@ -46,6 +47,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; *pointer.load(Ordering::Acquire) = 3; }); diff --git a/src/tools/miri/tests/fail/data_race/relax_acquire_race.rs b/src/tools/miri/tests/fail/data_race/relax_acquire_race.rs index b7226fa626f..1b691b996f1 100644 --- a/src/tools/miri/tests/fail/data_race/relax_acquire_race.rs +++ b/src/tools/miri/tests/fail/data_race/relax_acquire_race.rs @@ -25,6 +25,7 @@ pub fn main() { // 4. load acquire : 2 unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 1; SYNC.store(1, Ordering::Release); }); @@ -36,6 +37,7 @@ pub fn main() { }); let j3 = spawn(move || { + let c = c; // avoid field capturing if SYNC.load(Ordering::Acquire) == 2 { *c.0 //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Read on thread `<unnamed>` } else { diff --git a/src/tools/miri/tests/fail/data_race/release_seq_race.rs b/src/tools/miri/tests/fail/data_race/release_seq_race.rs index dff33a42a1c..80b30053fc7 100644 --- a/src/tools/miri/tests/fail/data_race/release_seq_race.rs +++ b/src/tools/miri/tests/fail/data_race/release_seq_race.rs @@ -27,6 +27,7 @@ pub fn main() { // 4. load acquire : 3 unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 1; SYNC.store(1, Ordering::Release); sleep(Duration::from_millis(200)); @@ -39,6 +40,7 @@ pub fn main() { }); let j3 = spawn(move || { + let c = c; // avoid field capturing sleep(Duration::from_millis(500)); if SYNC.load(Ordering::Acquire) == 3 { *c.0 //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Read on thread `<unnamed>` diff --git a/src/tools/miri/tests/fail/data_race/release_seq_race_same_thread.rs b/src/tools/miri/tests/fail/data_race/release_seq_race_same_thread.rs index f7a523841b8..33de1f17558 100644 --- a/src/tools/miri/tests/fail/data_race/release_seq_race_same_thread.rs +++ b/src/tools/miri/tests/fail/data_race/release_seq_race_same_thread.rs @@ -25,6 +25,7 @@ pub fn main() { // 3. load acquire : 2 unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 1; SYNC.store(1, Ordering::Release); @@ -36,6 +37,7 @@ pub fn main() { }); let j2 = spawn(move || { + let c = c; // avoid field capturing if SYNC.load(Ordering::Acquire) == 2 { *c.0 //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Read on thread `<unnamed>` } else { diff --git a/src/tools/miri/tests/fail/data_race/rmw_race.rs b/src/tools/miri/tests/fail/data_race/rmw_race.rs index 2201362b167..4d0ce8f9433 100644 --- a/src/tools/miri/tests/fail/data_race/rmw_race.rs +++ b/src/tools/miri/tests/fail/data_race/rmw_race.rs @@ -25,6 +25,7 @@ pub fn main() { // 4. load acquire : 3 unsafe { let j1 = spawn(move || { + let c = c; // capture `c`, not just its field. *c.0 = 1; SYNC.store(1, Ordering::Release); }); @@ -37,6 +38,7 @@ pub fn main() { }); let j3 = spawn(move || { + let c = c; // capture `c`, not just its field. if SYNC.load(Ordering::Acquire) == 3 { *c.0 //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Read on thread `<unnamed>` } else { diff --git a/src/tools/miri/tests/fail/data_race/stack_pop_race.rs b/src/tools/miri/tests/fail/data_race/stack_pop_race.rs index dec5ff274cc..d3c2ab3e4a4 100644 --- a/src/tools/miri/tests/fail/data_race/stack_pop_race.rs +++ b/src/tools/miri/tests/fail/data_race/stack_pop_race.rs @@ -13,7 +13,7 @@ fn main() { fn race(local: i32) { let ptr = MakeSend(&local as *const i32); thread::spawn(move || { - let ptr = ptr; + let ptr = ptr; // avoid field capturing let _val = unsafe { *ptr.0 }; }); // Make the other thread go first so that it does not UAF. diff --git a/src/tools/miri/tests/fail/data_race/write_write_race.rs b/src/tools/miri/tests/fail/data_race/write_write_race.rs index fe02d02f9dc..30e3460f222 100644 --- a/src/tools/miri/tests/fail/data_race/write_write_race.rs +++ b/src/tools/miri/tests/fail/data_race/write_write_race.rs @@ -15,10 +15,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 32; }); let j2 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 64; //~ ERROR: Data race detected between (1) Write on thread `<unnamed>` and (2) Write on thread `<unnamed>` }); diff --git a/src/tools/miri/tests/fail/data_race/write_write_race_stack.rs b/src/tools/miri/tests/fail/data_race/write_write_race_stack.rs index c1c1b1fa6e3..25be42bd4eb 100644 --- a/src/tools/miri/tests/fail/data_race/write_write_race_stack.rs +++ b/src/tools/miri/tests/fail/data_race/write_write_race_stack.rs @@ -28,6 +28,7 @@ pub fn main() { // 5. write-value unsafe { let j1 = spawn(move || { + let ptr = ptr; // avoid field capturing // Concurrent allocate the memory. // Uses relaxed semantics to not generate // a release sequence. @@ -46,6 +47,7 @@ pub fn main() { }); let j2 = spawn(move || { + let ptr = ptr; // avoid field capturing let pointer = &*ptr.0; *pointer.load(Ordering::Acquire) = 3; }); diff --git a/src/tools/miri/tests/fail/erroneous_const.stderr b/src/tools/miri/tests/fail/erroneous_const.stderr index c32ebf67a11..209c4a932dc 100644 --- a/src/tools/miri/tests/fail/erroneous_const.stderr +++ b/src/tools/miri/tests/fail/erroneous_const.stderr @@ -4,7 +4,7 @@ error[E0080]: evaluation of `PrintName::<i32>::VOID` failed LL | const VOID: ! = panic!(); | ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/erroneous_const.rs:LL:CC | - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: erroneous constant used --> $DIR/erroneous_const.rs:LL:CC diff --git a/src/tools/miri/tests/fail/panic/double_panic.stderr b/src/tools/miri/tests/fail/panic/double_panic.stderr index 5384f6f6716..77d5fc5d7ce 100644 --- a/src/tools/miri/tests/fail/panic/double_panic.stderr +++ b/src/tools/miri/tests/fail/panic/double_panic.stderr @@ -12,7 +12,8 @@ LL | ABORT(); = note: inside `std::sys::PLATFORM::abort_internal` at RUSTLIB/std/src/sys/PLATFORM/mod.rs:LL:CC = note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC = note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC - = note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::rt::begin_panic<&str>::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC + = note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC + = note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC note: inside `<Foo as std::ops::Drop>::drop` --> $DIR/double_panic.rs:LL:CC | @@ -24,7 +25,7 @@ note: inside `main` | LL | } | ^ - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/panic/no_std.stderr b/src/tools/miri/tests/fail/panic/no_std.stderr index 39ad0d268b9..f8307c0c23b 100644 --- a/src/tools/miri/tests/fail/panic/no_std.stderr +++ b/src/tools/miri/tests/fail/panic/no_std.stderr @@ -11,7 +11,7 @@ note: inside `start` | LL | panic!("blarg I am dead") | ^^^^^^^^^^^^^^^^^^^^^^^^^ - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/panic/panic_abort1.stderr b/src/tools/miri/tests/fail/panic/panic_abort1.stderr index d25dd7be635..d9303fd0d06 100644 --- a/src/tools/miri/tests/fail/panic/panic_abort1.stderr +++ b/src/tools/miri/tests/fail/panic/panic_abort1.stderr @@ -11,13 +11,14 @@ LL | ABORT(); = note: inside `std::panicking::rust_panic` at RUSTLIB/std/src/panicking.rs:LL:CC = note: inside `std::panicking::rust_panic_with_hook` at RUSTLIB/std/src/panicking.rs:LL:CC = note: inside closure at RUSTLIB/std/src/panicking.rs:LL:CC - = note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::rt::begin_panic<&str>::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC + = note: inside `std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !>` at RUSTLIB/std/src/sys_common/backtrace.rs:LL:CC + = note: inside `std::panicking::begin_panic_handler` at RUSTLIB/std/src/panicking.rs:LL:CC note: inside `main` --> $DIR/panic_abort1.rs:LL:CC | LL | std::panic!("panicking from libstd"); | ^ - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `std::panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `std::panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/panic/panic_abort2.stderr b/src/tools/miri/tests/fail/panic/panic_abort2.stderr index f56d509a697..54cbc9b5f6d 100644 --- a/src/tools/miri/tests/fail/panic/panic_abort2.stderr +++ b/src/tools/miri/tests/fail/panic/panic_abort2.stderr @@ -18,7 +18,7 @@ note: inside `main` | LL | std::panic!("{}-panicking from libstd", 42); | ^ - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `std::panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `std::panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/panic/panic_abort3.stderr b/src/tools/miri/tests/fail/panic/panic_abort3.stderr index 43792f76993..64eea47b14b 100644 --- a/src/tools/miri/tests/fail/panic/panic_abort3.stderr +++ b/src/tools/miri/tests/fail/panic/panic_abort3.stderr @@ -18,7 +18,7 @@ note: inside `main` | LL | core::panic!("panicking from libcore"); | ^ - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `core::panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `core::panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/panic/panic_abort4.stderr b/src/tools/miri/tests/fail/panic/panic_abort4.stderr index 89e181bfb27..21beb100645 100644 --- a/src/tools/miri/tests/fail/panic/panic_abort4.stderr +++ b/src/tools/miri/tests/fail/panic/panic_abort4.stderr @@ -18,7 +18,7 @@ note: inside `main` | LL | core::panic!("{}-panicking from libcore", 42); | ^ - = note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `core::panic` (in Nightly builds, run with -Z macro-backtrace for more info) + = note: this error originates in the macro `$crate::panic::panic_2021` which comes from the expansion of the macro `core::panic` (in Nightly builds, run with -Z macro-backtrace for more info) note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/panic/panic1.stderr b/src/tools/miri/tests/panic/panic1.stderr index 15834d58bc6..0f4535e6792 100644 --- a/src/tools/miri/tests/panic/panic1.stderr +++ b/src/tools/miri/tests/panic/panic1.stderr @@ -1,9 +1,11 @@ thread 'main' panicked at 'panicking from libstd', $DIR/panic1.rs:LL:CC stack backtrace: - 0: std::rt::begin_panic + 0: std::panicking::begin_panic_handler at RUSTLIB/std/src/panicking.rs:LL:CC - 1: main + 1: std::rt::panic_fmt + at RUSTLIB/core/src/panicking.rs:LL:CC + 2: main at $DIR/panic1.rs:LL:CC - 2: <fn() as std::ops::FnOnce<()>>::call_once - shim(fn()) + 3: <fn() as std::ops::FnOnce<()>>::call_once - shim(fn()) at RUSTLIB/core/src/ops/function.rs:LL:CC note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. diff --git a/src/tools/miri/tests/pass-dep/shims/libc-misc.rs b/src/tools/miri/tests/pass-dep/shims/libc-misc.rs index 82ef59427ae..68504cb1c79 100644 --- a/src/tools/miri/tests/pass-dep/shims/libc-misc.rs +++ b/src/tools/miri/tests/pass-dep/shims/libc-misc.rs @@ -101,7 +101,6 @@ fn test_posix_realpath_errors() { #[cfg(target_os = "linux")] fn test_posix_fadvise() { - use std::convert::TryInto; use std::io::Write; let path = tmp().join("miri_test_libc_posix_fadvise.txt"); diff --git a/src/tools/miri/tests/pass/0weak_memory_consistency.rs b/src/tools/miri/tests/pass/0weak_memory_consistency.rs index 3a531eede67..abfe3b0adeb 100644 --- a/src/tools/miri/tests/pass/0weak_memory_consistency.rs +++ b/src/tools/miri/tests/pass/0weak_memory_consistency.rs @@ -116,11 +116,13 @@ fn test_message_passing() { #[rustfmt::skip] let j1 = spawn(move || { + let x = x; // avoid field capturing unsafe { *x.0 = 1 }; // -----------------------------------------+ y.store(1, Release); // ---------------------+ | }); // | | #[rustfmt::skip] // |synchronizes-with | happens-before let j2 = spawn(move || { // | | + let x = x; // avoid field capturing | | acquires_value(&y, 1); // <------------------+ | unsafe { *x.0 } // <---------------------------------------------+ }); diff --git a/src/tools/miri/tests/pass/concurrency/data_race.rs b/src/tools/miri/tests/pass/concurrency/data_race.rs index 4e3c99058a0..d31420380a5 100644 --- a/src/tools/miri/tests/pass/concurrency/data_race.rs +++ b/src/tools/miri/tests/pass/concurrency/data_race.rs @@ -17,12 +17,14 @@ fn test_fence_sync() { let evil_ptr = EvilSend(ptr); let j1 = spawn(move || { + let evil_ptr = evil_ptr; // avoid field capturing unsafe { *evil_ptr.0 = 1 }; fence(Ordering::Release); SYNC.store(1, Ordering::Relaxed) }); let j2 = spawn(move || { + let evil_ptr = evil_ptr; // avoid field capturing if SYNC.load(Ordering::Relaxed) == 1 { fence(Ordering::Acquire); unsafe { *evil_ptr.0 } @@ -40,10 +42,10 @@ fn test_multiple_reads() { let ptr = &mut var as *mut u32; let evil_ptr = EvilSend(ptr); - let j1 = spawn(move || unsafe { *evil_ptr.0 }); - let j2 = spawn(move || unsafe { *evil_ptr.0 }); - let j3 = spawn(move || unsafe { *evil_ptr.0 }); - let j4 = spawn(move || unsafe { *evil_ptr.0 }); + let j1 = spawn(move || unsafe { *{ evil_ptr }.0 }); + let j2 = spawn(move || unsafe { *{ evil_ptr }.0 }); + let j3 = spawn(move || unsafe { *{ evil_ptr }.0 }); + let j4 = spawn(move || unsafe { *{ evil_ptr }.0 }); assert_eq!(j1.join().unwrap(), 42); assert_eq!(j2.join().unwrap(), 42); @@ -63,6 +65,7 @@ pub fn test_rmw_no_block() { unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 1; SYNC.store(1, Ordering::Release); }); @@ -73,7 +76,10 @@ pub fn test_rmw_no_block() { } }); - let j3 = spawn(move || if SYNC.load(Ordering::Acquire) == 2 { *c.0 } else { 0 }); + let j3 = spawn(move || { + let c = c; // avoid field capturing + if SYNC.load(Ordering::Acquire) == 2 { *c.0 } else { 0 } + }); j1.join().unwrap(); j2.join().unwrap(); @@ -91,11 +97,15 @@ pub fn test_simple_release() { unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 1; SYNC.store(1, Ordering::Release); }); - let j2 = spawn(move || if SYNC.load(Ordering::Acquire) == 1 { *c.0 } else { 0 }); + let j2 = spawn(move || { + let c = c; // avoid field capturing + if SYNC.load(Ordering::Acquire) == 1 { *c.0 } else { 0 } + }); j1.join().unwrap(); assert_eq!(j2.join().unwrap(), 1); // relies on thread 2 going last diff --git a/src/tools/miri/tests/pass/concurrency/disable_data_race_detector.rs b/src/tools/miri/tests/pass/concurrency/disable_data_race_detector.rs index d71e51b0384..049b5e7f498 100644 --- a/src/tools/miri/tests/pass/concurrency/disable_data_race_detector.rs +++ b/src/tools/miri/tests/pass/concurrency/disable_data_race_detector.rs @@ -14,10 +14,12 @@ pub fn main() { let c = EvilSend(b); unsafe { let j1 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 32; }); let j2 = spawn(move || { + let c = c; // avoid field capturing *c.0 = 64; // Data race (but not detected as the detector is disabled) }); diff --git a/src/tools/miri/tests/pass/concurrency/sync.rs b/src/tools/miri/tests/pass/concurrency/sync.rs index 3bd1e542407..dccc9d104dd 100644 --- a/src/tools/miri/tests/pass/concurrency/sync.rs +++ b/src/tools/miri/tests/pass/concurrency/sync.rs @@ -201,8 +201,10 @@ fn park_timeout() { thread::park_timeout(Duration::from_millis(200)); // Normally, waiting in park/park_timeout may spuriously wake up early, but we // know Miri's timed synchronization primitives do not do that. - - assert!((200..1000).contains(&start.elapsed().as_millis())); + // We allow much longer sleeps as well since the macOS GHA runners seem very oversubscribed + // and sometimes just pause for 1 second or more. + let elapsed = start.elapsed(); + assert!((200..2000).contains(&elapsed.as_millis()), "bad sleep time: {elapsed:?}"); } fn park_unpark() { @@ -219,8 +221,10 @@ fn park_unpark() { thread::park(); // Normally, waiting in park/park_timeout may spuriously wake up early, but we // know Miri's timed synchronization primitives do not do that. - - assert!((200..1000).contains(&start.elapsed().as_millis())); + // We allow much longer sleeps as well since the macOS GHA runners seem very oversubscribed + // and sometimes just pause for 1 second or more. + let elapsed = start.elapsed(); + assert!((200..2000).contains(&elapsed.as_millis()), "bad sleep time: {elapsed:?}"); t2.join().unwrap(); } diff --git a/src/tools/miri/tests/pass/concurrency/thread_locals.rs b/src/tools/miri/tests/pass/concurrency/thread_locals.rs index 13c11b55775..fc4c8a283dd 100644 --- a/src/tools/miri/tests/pass/concurrency/thread_locals.rs +++ b/src/tools/miri/tests/pass/concurrency/thread_locals.rs @@ -42,6 +42,7 @@ fn main() { }; thread::spawn(move || unsafe { + let ptr = ptr; // avoid field capturing assert_eq!(*ptr.0, 5); assert_eq!(A, 0); assert_eq!(B, 0); diff --git a/src/tools/miri/tests/pass/concurrency/windows_condvar_shared.rs b/src/tools/miri/tests/pass/concurrency/windows_condvar_shared.rs index d89320bfe59..3b27af9094c 100644 --- a/src/tools/miri/tests/pass/concurrency/windows_condvar_shared.rs +++ b/src/tools/miri/tests/pass/concurrency/windows_condvar_shared.rs @@ -44,6 +44,8 @@ fn all_shared() { // waiters for i in 0..5 { handles.push(thread::spawn(move || { + let condvar_ptr = condvar_ptr; // avoid field capture + let lock_ptr = lock_ptr; // avoid field capture unsafe { AcquireSRWLockShared(lock_ptr.0); } @@ -71,6 +73,7 @@ fn all_shared() { // readers for i in 0..5 { handles.push(thread::spawn(move || { + let lock_ptr = lock_ptr; // avoid field capture unsafe { AcquireSRWLockShared(lock_ptr.0); } @@ -111,6 +114,8 @@ fn shared_sleep_and_exclusive_lock() { let mut waiters = Vec::with_capacity(5); for i in 0..5 { waiters.push(thread::spawn(move || { + let lock_ptr = lock_ptr; // avoid field capture + let condvar_ptr = condvar_ptr; // avoid field capture unsafe { AcquireSRWLockShared(lock_ptr.0); } @@ -170,6 +175,8 @@ fn exclusive_sleep_and_shared_lock() { let mut handles = Vec::with_capacity(10); for i in 0..5 { handles.push(thread::spawn(move || { + let lock_ptr = lock_ptr; // avoid field capture + let condvar_ptr = condvar_ptr; // avoid field capture unsafe { AcquireSRWLockExclusive(lock_ptr.0); } @@ -193,6 +200,7 @@ fn exclusive_sleep_and_shared_lock() { for i in 0..5 { handles.push(thread::spawn(move || { + let lock_ptr = lock_ptr; // avoid field capture unsafe { AcquireSRWLockShared(lock_ptr.0); } diff --git a/src/tools/miri/tests/pass/concurrency/windows_init_once.rs b/src/tools/miri/tests/pass/concurrency/windows_init_once.rs index 4eb88379620..b2412f7dbb0 100644 --- a/src/tools/miri/tests/pass/concurrency/windows_init_once.rs +++ b/src/tools/miri/tests/pass/concurrency/windows_init_once.rs @@ -66,6 +66,7 @@ fn block_until_complete() { let init_once_ptr = SendPtr(&mut init_once); let waiter = move || unsafe { + let init_once_ptr = init_once_ptr; // avoid field capture let mut pending = 0; assert_eq!(InitOnceBeginInitialize(init_once_ptr.0, 0, &mut pending, null_mut()), TRUE); @@ -102,6 +103,7 @@ fn retry_on_fail() { let init_once_ptr = SendPtr(&mut init_once); let waiter = move || unsafe { + let init_once_ptr = init_once_ptr; // avoid field capture let mut pending = 0; assert_eq!(InitOnceBeginInitialize(init_once_ptr.0, 0, &mut pending, null_mut()), TRUE); @@ -146,6 +148,8 @@ fn no_data_race_after_complete() { let place_ptr = SendPtr(&mut place); let reader = thread::spawn(move || unsafe { + let init_once_ptr = init_once_ptr; // avoid field capture + let place_ptr = place_ptr; // avoid field capture let mut pending = 0; // this doesn't block because reader only executes after `InitOnceComplete` is called diff --git a/src/tools/miri/tests/pass/panic/catch_panic.rs b/src/tools/miri/tests/pass/panic/catch_panic.rs index 5d57df4e52b..1b00f7cea30 100644 --- a/src/tools/miri/tests/pass/panic/catch_panic.rs +++ b/src/tools/miri/tests/pass/panic/catch_panic.rs @@ -49,13 +49,12 @@ fn main() { // Std panics test(None, |_old_val| std::panic!("Hello from panic: std")); - test(None, |old_val| std::panic!(format!("Hello from panic: {:?}", old_val))); + test(None, |old_val| std::panic::panic_any(format!("Hello from panic: {:?}", old_val))); test(None, |old_val| std::panic!("Hello from panic: {:?}", old_val)); - test(None, |_old_val| std::panic!(1337)); + test(None, |_old_val| std::panic::panic_any(1337)); // Core panics test(None, |_old_val| core::panic!("Hello from panic: core")); - test(None, |old_val| core::panic!(&format!("Hello from panic: {:?}", old_val))); test(None, |old_val| core::panic!("Hello from panic: {:?}", old_val)); // Built-in panics; also make sure the message is right. diff --git a/src/tools/miri/tests/pass/panic/catch_panic.stderr b/src/tools/miri/tests/pass/panic/catch_panic.stderr index 0ced5588cc1..f43434582a2 100644 --- a/src/tools/miri/tests/pass/panic/catch_panic.stderr +++ b/src/tools/miri/tests/pass/panic/catch_panic.stderr @@ -11,8 +11,6 @@ thread 'main' panicked at 'Hello from panic: core', $DIR/catch_panic.rs:LL:CC Caught panic message (&str): Hello from panic: core thread 'main' panicked at 'Hello from panic: 5', $DIR/catch_panic.rs:LL:CC Caught panic message (String): Hello from panic: 5 -thread 'main' panicked at 'Hello from panic: 6', $DIR/catch_panic.rs:LL:CC -Caught panic message (String): Hello from panic: 6 thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 4', $DIR/catch_panic.rs:LL:CC Caught panic message (String): index out of bounds: the len is 3 but the index is 4 thread 'main' panicked at 'attempt to divide by zero', $DIR/catch_panic.rs:LL:CC diff --git a/src/tools/miri/tests/pass/panic/concurrent-panic.rs b/src/tools/miri/tests/pass/panic/concurrent-panic.rs index 776bc2057f3..7cc1e2a973f 100644 --- a/src/tools/miri/tests/pass/panic/concurrent-panic.rs +++ b/src/tools/miri/tests/pass/panic/concurrent-panic.rs @@ -57,7 +57,7 @@ fn main() { let t2_started_pair = t2_started_pair.clone(); let block_on_drop = BlockOnDrop::new(t1); spawn(move || { - let _ = block_on_drop; + let _capture = block_on_drop; let (mutex, condvar) = &*t2_started_pair; *mutex.lock().unwrap() = true; |
