rustnomicon包含以下示例:
#[no_mangle]
extern "C" fn assert_nonzero(input: u32) {
assert!(input != 0)
}
如果
assert_nonzero
使用参数 调用0
,则运行时保证(安全)中止进程,无论是否使用panic=abort
.
另一方面,Rust Reference声称:
行为被视为未定义:[...] 使用错误的调用 ABI 调用函数或从具有错误的展开 ABI 的函数展开。
这两种说法对我来说似乎是矛盾的。assert_nonzero
拥有C
ABI,但摆脱了 Rust 恐慌。那么这是否保证(安全)中止或UB?不可能两者兼而有之。
Chayim Friedman 在另一个问题上善意地表示这确实是 UB。
那么 Rustnomicon 是否已经过时了,或者我是否误解了什么?
更一般地说:跨越 FFI 边界的 Rust 恐慌何时被视为未定义行为?
来自ABI的 RFC
-unwind
:所以看起来这曾经是 UB,但是在这个 RFC 被接受之后,这不再是 UB 并且肯定会中止。
我不知道我们是否可以说该引用已经过时,因为我们可以说我们只是不会因
extern "C"
Rust 函数的恐慌而放松(而是中止)。