P.UNS.FFI.04 如果一个函数正在跨越 FFi 边界,那么需要处理 Panic

【描述】

如果让 Panic 在跨越 FFi 边界时发生,可能会产生未定义行为。

处理 Panic 可以使用 catch_unwind,但是它只对实现了 UnwindSafe trait 的类型起作用。另外一种方法就是避免 Panic,而返回错误码。

【正例】

use std::panic::catch_unwind;

#[no_mangle]
pub extern fn oh_no() -> i32 {
    let result = catch_unwind(|| {
        panic!("Oops!"); // 这里会发生 Panic,需要处理
    });
    match result {
        Ok(_) => 0,
        Err(_) => 1,
    }
}

fn main() {}