0 Tage Serie
rust / expert
Snippet

Abfangen von Panic-Unwinding für sichere Grenzen

In Rust führen Panics zum Unwinding des Stacks, es sei denn, sie sind auf Abort konfiguriert. Mit catch_unwind können wir Panics an FFI-Grenzen oder Thread-Wurzeln abfangen und so ein Abstürzen des Prozesses verhindern. AssertUnwindSafe wird verwendet, um zu erklären, dass die erfasste Umgebung bei einer Panic keine logischen Invarianten bricht.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use std::panic::{catch_unwind, AssertUnwindSafe};
fn run_untrusted_code<F: FnOnce()>(f: F) -> Result<(), &'static str> {
let result = catch_unwind(AssertUnwindSafe(f));
match result {
Ok(_) => Ok(()),
Err(_) => Err("Untrusted execution panicked!"),
}
}
fn main() {
let res = run_untrusted_code(|| {
panic!("Oops!");
});
assert!(res.is_err());
}
Erklärung
1
catch_unwind(AssertUnwindSafe(f))
Führt den Closure aus und fängt jede Panic ab, die während der Ausführung auftritt, und verpackt das Ergebnis in ein Result.
2
AssertUnwindSafe(f)
Sichert zu, dass das Unwinding für den Closure sicher ist, wodurch die standardmäßigen, konservativen UnwindSafe-Prüfungen des Compilers umgangen werden.