CommandExt::before_exec: deprecate safety in edition 2024
This commit is contained in:
parent
fbce03b195
commit
5ae03863de
@ -109,13 +109,21 @@ pub trait CommandExt: Sealed {
|
|||||||
/// Schedules a closure to be run just before the `exec` function is
|
/// Schedules a closure to be run just before the `exec` function is
|
||||||
/// invoked.
|
/// invoked.
|
||||||
///
|
///
|
||||||
/// This method is stable and usable, but it should be unsafe. To fix
|
/// `before_exec` used to be a safe method, but it needs to be unsafe since the closure may only
|
||||||
/// that, it got deprecated in favor of the unsafe [`pre_exec`].
|
/// perform operations that are *async-signal-safe*. Hence it got deprecated in favor of the
|
||||||
|
/// unsafe [`pre_exec`]. Meanwhile, Rust gained the ability to make an existing safe method
|
||||||
|
/// fully unsafe in a new edition, which is how `before_exec` became `unsafe`. It still also
|
||||||
|
/// remains deprecated; `pre_exec` should be used instead.
|
||||||
///
|
///
|
||||||
/// [`pre_exec`]: CommandExt::pre_exec
|
/// [`pre_exec`]: CommandExt::pre_exec
|
||||||
#[stable(feature = "process_exec", since = "1.15.0")]
|
#[stable(feature = "process_exec", since = "1.15.0")]
|
||||||
#[deprecated(since = "1.37.0", note = "should be unsafe, use `pre_exec` instead")]
|
#[deprecated(since = "1.37.0", note = "should be unsafe, use `pre_exec` instead")]
|
||||||
fn before_exec<F>(&mut self, f: F) -> &mut process::Command
|
#[cfg_attr(bootstrap, rustc_deprecated_safe_2024)]
|
||||||
|
#[cfg_attr(
|
||||||
|
not(bootstrap),
|
||||||
|
rustc_deprecated_safe_2024(audit_that = "the closure is async-signal-safe")
|
||||||
|
)]
|
||||||
|
unsafe fn before_exec<F>(&mut self, f: F) -> &mut process::Command
|
||||||
where
|
where
|
||||||
F: FnMut() -> io::Result<()> + Send + Sync + 'static,
|
F: FnMut() -> io::Result<()> + Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
|
11
tests/ui/rust-2024/unsafe-before_exec.e2024.stderr
Normal file
11
tests/ui/rust-2024/unsafe-before_exec.e2024.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error[E0133]: call to unsafe function `before_exec` is unsafe and requires unsafe block
|
||||||
|
--> $DIR/unsafe-before_exec.rs:14:5
|
||||||
|
|
|
||||||
|
LL | cmd.before_exec(|| Ok(()));
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ call to unsafe function
|
||||||
|
|
|
||||||
|
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0133`.
|
17
tests/ui/rust-2024/unsafe-before_exec.rs
Normal file
17
tests/ui/rust-2024/unsafe-before_exec.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
//@ revisions: e2021 e2024
|
||||||
|
//@ only-unix
|
||||||
|
//@[e2021] edition: 2021
|
||||||
|
//@[e2021] check-pass
|
||||||
|
//@[e2024] edition: 2024
|
||||||
|
//@[e2024] compile-flags: -Zunstable-options
|
||||||
|
|
||||||
|
use std::process::Command;
|
||||||
|
use std::os::unix::process::CommandExt;
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
|
fn main() {
|
||||||
|
let mut cmd = Command::new("sleep");
|
||||||
|
cmd.before_exec(|| Ok(()));
|
||||||
|
//[e2024]~^ ERROR call to unsafe function `before_exec` is unsafe
|
||||||
|
drop(cmd); // we don't actually run the command.
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user