From 7acf80d2bb7c50c2f60807cb3f543955e7fef677 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 2 Mar 2021 10:44:06 +0100 Subject: [PATCH] rustup; fix tests for new MIR optimization --- rust-version | 2 +- .../data_race/dealloc_read_race_stack.rs | 8 +-- .../data_race/dealloc_read_race_stack_drop.rs | 52 ------------------ .../data_race/dealloc_write_race_stack.rs | 8 +-- .../dealloc_write_race_stack_drop.rs | 53 ------------------- ...lock_read_write_deadlock_single_thread.rs} | 3 +- ...wlock_write_read_deadlock_single_thread.rs | 3 +- ...lock_write_write_deadlock_single_thread.rs | 3 +- 8 files changed, 15 insertions(+), 117 deletions(-) delete mode 100644 tests/compile-fail/data_race/dealloc_read_race_stack_drop.rs delete mode 100644 tests/compile-fail/data_race/dealloc_write_race_stack_drop.rs rename tests/compile-fail/sync/{libc_pthread_rwlock_read_write_deadlock.rs => libc_pthread_rwlock_read_write_deadlock_single_thread.rs} (77%) diff --git a/rust-version b/rust-version index 059dfeb2e6d3..65644e75d977 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -d2731d8e9338d8fe844e19d3fbb39617753e65f4 +09db05762b283bed62d4f92729cfee4646519833 diff --git a/tests/compile-fail/data_race/dealloc_read_race_stack.rs b/tests/compile-fail/data_race/dealloc_read_race_stack.rs index 31960fb2162b..281aff863146 100644 --- a/tests/compile-fail/data_race/dealloc_read_race_stack.rs +++ b/tests/compile-fail/data_race/dealloc_read_race_stack.rs @@ -1,5 +1,6 @@ // ignore-windows: Concurrency on Windows is not supported yet. -// compile-flags: -Zmiri-disable-isolation +// compile-flags: -Zmiri-disable-isolation -Zmir-opt-level=0 +// With optimizations (in particular #78360), the span becomes much worse, so we disable them. use std::thread::{spawn, sleep}; use std::ptr::null_mut; @@ -27,9 +28,6 @@ pub fn main() { // 3. stack-deallocate unsafe { let j1 = spawn(move || { - // Concurrent allocate the memory. - // Uses relaxed semantics to not generate - // a release sequence. let pointer = &*ptr.0; { let mut stack_var = 0usize; @@ -38,6 +36,8 @@ pub fn main() { sleep(Duration::from_millis(200)); + // Now `stack_var` gets deallocated. + } //~ ERROR Data race detected between Deallocate on Thread(id = 1) and Read on Thread(id = 2) }); diff --git a/tests/compile-fail/data_race/dealloc_read_race_stack_drop.rs b/tests/compile-fail/data_race/dealloc_read_race_stack_drop.rs deleted file mode 100644 index 44950a34db2f..000000000000 --- a/tests/compile-fail/data_race/dealloc_read_race_stack_drop.rs +++ /dev/null @@ -1,52 +0,0 @@ -// ignore-windows: Concurrency on Windows is not supported yet. -// compile-flags: -Zmiri-disable-isolation - -use std::thread::{spawn, sleep}; -use std::ptr::null_mut; -use std::sync::atomic::{Ordering, AtomicPtr}; -use std::time::Duration; - -#[derive(Copy, Clone)] -struct EvilSend(pub T); - -unsafe impl Send for EvilSend {} -unsafe impl Sync for EvilSend {} - -pub fn main() { - // Shared atomic pointer - let pointer = AtomicPtr::new(null_mut::()); - let ptr = EvilSend(&pointer as *const AtomicPtr); - - // Note: this is scheduler-dependent - // the operations need to occur in - // order, otherwise the allocation is - // not visible to the other-thread to - // detect the race: - // 1. stack-allocate - // 2. read - // 3. stack-deallocate - unsafe { - let j1 = spawn(move || { - // Concurrent allocate the memory. - // Uses relaxed semantics to not generate - // a release sequence. - let pointer = &*ptr.0; - - let mut stack_var = 0usize; - - pointer.store(&mut stack_var as *mut _, Ordering::Release); - - sleep(Duration::from_millis(200)); - - drop(stack_var); - }); //~ ERROR Data race detected between Deallocate on Thread(id = 1) and Read on Thread(id = 2) - - let j2 = spawn(move || { - let pointer = &*ptr.0; - *pointer.load(Ordering::Acquire) - }); - - j1.join().unwrap(); - j2.join().unwrap(); - } -} diff --git a/tests/compile-fail/data_race/dealloc_write_race_stack.rs b/tests/compile-fail/data_race/dealloc_write_race_stack.rs index 25dea65fe7e0..55aaa0c1635a 100644 --- a/tests/compile-fail/data_race/dealloc_write_race_stack.rs +++ b/tests/compile-fail/data_race/dealloc_write_race_stack.rs @@ -1,5 +1,6 @@ // ignore-windows: Concurrency on Windows is not supported yet. -// compile-flags: -Zmiri-disable-isolation +// compile-flags: -Zmiri-disable-isolation -Zmir-opt-level=0 +// With optimizations (in particular #78360), the span becomes much worse, so we disable them. use std::thread::{spawn, sleep}; use std::ptr::null_mut; @@ -27,9 +28,6 @@ pub fn main() { // 3. stack-deallocate unsafe { let j1 = spawn(move || { - // Concurrent allocate the memory. - // Uses relaxed semantics to not generate - // a release sequence. let pointer = &*ptr.0; { let mut stack_var = 0usize; @@ -38,6 +36,8 @@ pub fn main() { sleep(Duration::from_millis(200)); + // Now `stack_var` gets deallocated. + } //~ ERROR Data race detected between Deallocate on Thread(id = 1) and Write on Thread(id = 2) }); diff --git a/tests/compile-fail/data_race/dealloc_write_race_stack_drop.rs b/tests/compile-fail/data_race/dealloc_write_race_stack_drop.rs deleted file mode 100644 index 1d239e9eb74d..000000000000 --- a/tests/compile-fail/data_race/dealloc_write_race_stack_drop.rs +++ /dev/null @@ -1,53 +0,0 @@ -// ignore-windows: Concurrency on Windows is not supported yet. -// compile-flags: -Zmiri-disable-isolation - -use std::thread::{spawn, sleep}; -use std::ptr::null_mut; -use std::sync::atomic::{Ordering, AtomicPtr}; -use std::time::Duration; - -#[derive(Copy, Clone)] -struct EvilSend(pub T); - -unsafe impl Send for EvilSend {} -unsafe impl Sync for EvilSend {} - -pub fn main() { - // Shared atomic pointer - let pointer = AtomicPtr::new(null_mut::()); - let ptr = EvilSend(&pointer as *const AtomicPtr); - - // Note: this is scheduler-dependent - // the operations need to occur in - // order, otherwise the allocation is - // not visible to the other-thread to - // detect the race: - // 1. stack-allocate - // 2. read - // 3. stack-deallocate - unsafe { - let j1 = spawn(move || { - // Concurrent allocate the memory. - // Uses relaxed semantics to not generate - // a release sequence. - let pointer = &*ptr.0; - - let mut stack_var = 0usize; - - pointer.store(&mut stack_var as *mut _, Ordering::Release); - - sleep(Duration::from_millis(200)); - - // Note: Implicit read for drop(_) races with write, would detect race with deallocate after. - drop(stack_var); //~ ERROR Data race detected between Read on Thread(id = 1) and Write on Thread(id = 2) - }); - - let j2 = spawn(move || { - let pointer = &*ptr.0; - *pointer.load(Ordering::Acquire) = 3; - }); - - j1.join().unwrap(); - j2.join().unwrap(); - } -} diff --git a/tests/compile-fail/sync/libc_pthread_rwlock_read_write_deadlock.rs b/tests/compile-fail/sync/libc_pthread_rwlock_read_write_deadlock_single_thread.rs similarity index 77% rename from tests/compile-fail/sync/libc_pthread_rwlock_read_write_deadlock.rs rename to tests/compile-fail/sync/libc_pthread_rwlock_read_write_deadlock_single_thread.rs index dd4707d60e4c..da45d062d03b 100644 --- a/tests/compile-fail/sync/libc_pthread_rwlock_read_write_deadlock.rs +++ b/tests/compile-fail/sync/libc_pthread_rwlock_read_write_deadlock_single_thread.rs @@ -1,4 +1,5 @@ // ignore-windows: No libc on Windows +// error-pattern: deadlock #![feature(rustc_private)] @@ -8,6 +9,6 @@ fn main() { let rw = std::cell::UnsafeCell::new(libc::PTHREAD_RWLOCK_INITIALIZER); unsafe { assert_eq!(libc::pthread_rwlock_rdlock(rw.get()), 0); - libc::pthread_rwlock_wrlock(rw.get()); //~ ERROR: deadlock + libc::pthread_rwlock_wrlock(rw.get()); } } diff --git a/tests/compile-fail/sync/libc_pthread_rwlock_write_read_deadlock_single_thread.rs b/tests/compile-fail/sync/libc_pthread_rwlock_write_read_deadlock_single_thread.rs index 1b460e7174d2..ee2e57a9ab37 100644 --- a/tests/compile-fail/sync/libc_pthread_rwlock_write_read_deadlock_single_thread.rs +++ b/tests/compile-fail/sync/libc_pthread_rwlock_write_read_deadlock_single_thread.rs @@ -1,4 +1,5 @@ // ignore-windows: No libc on Windows +// error-pattern: deadlock #![feature(rustc_private)] @@ -8,6 +9,6 @@ fn main() { let rw = std::cell::UnsafeCell::new(libc::PTHREAD_RWLOCK_INITIALIZER); unsafe { assert_eq!(libc::pthread_rwlock_wrlock(rw.get()), 0); - libc::pthread_rwlock_rdlock(rw.get()); //~ ERROR: deadlock + libc::pthread_rwlock_rdlock(rw.get()); } } diff --git a/tests/compile-fail/sync/libc_pthread_rwlock_write_write_deadlock_single_thread.rs b/tests/compile-fail/sync/libc_pthread_rwlock_write_write_deadlock_single_thread.rs index cc327ec46bc2..f0404f202e56 100644 --- a/tests/compile-fail/sync/libc_pthread_rwlock_write_write_deadlock_single_thread.rs +++ b/tests/compile-fail/sync/libc_pthread_rwlock_write_write_deadlock_single_thread.rs @@ -1,4 +1,5 @@ // ignore-windows: No libc on Windows +// error-pattern: deadlock #![feature(rustc_private)] @@ -8,6 +9,6 @@ fn main() { let rw = std::cell::UnsafeCell::new(libc::PTHREAD_RWLOCK_INITIALIZER); unsafe { assert_eq!(libc::pthread_rwlock_wrlock(rw.get()), 0); - libc::pthread_rwlock_wrlock(rw.get()); //~ ERROR: deadlock + libc::pthread_rwlock_wrlock(rw.get()); } }