9c9a0da132
Guard against panic payloads panicking within entrypoints, where it is UB to do so. Note that there are a number of implementation approaches to consider. Some simpler, some more complicated. This particular solution is nice in that it also guards against accidental implementation issues in various pieces of runtime code, something we cannot prevent statically right now. Fixes #86030
30 lines
793 B
Rust
30 lines
793 B
Rust
// run-pass
|
|
// ignore-emscripten no processes
|
|
// ignore-sgx no processes
|
|
// ignore-wasm32-bare no unwinding panic
|
|
// ignore-avr no unwinding panic
|
|
// ignore-nvptx64 no unwinding panic
|
|
|
|
use std::env;
|
|
use std::process::Command;
|
|
|
|
struct Bomb;
|
|
|
|
impl Drop for Bomb {
|
|
fn drop(&mut self) {
|
|
std::panic::panic_any(Bomb);
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let args = env::args().collect::<Vec<_>>();
|
|
let output = match &args[..] {
|
|
[me] => Command::new(&me).arg("plant the").output(),
|
|
[..] => std::panic::panic_any(Bomb),
|
|
}.expect("running the command should have succeeded");
|
|
println!("{:#?}", output);
|
|
let stderr = std::str::from_utf8(&output.stderr);
|
|
assert!(stderr.map(|v| {
|
|
v.ends_with("drop of the panic payload panicked")
|
|
}).unwrap_or(false));
|
|
}
|