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.