我如何决定何时将函数标记为不安全?

How do I decide when to mark a function as unsafe?

什么时候将函数标记为 unsafe 与仅使用 unsafe 块比较合适?我在阅读 时看到了这个函数:

unsafe fn as_u8_slice(xs: &[i32]) -> &[u8] {
    std::slice::from_raw_parts(v.as_ptr() as *const u8, 
                               v.len() * std::mem::size_of::<i32>())
}

我可能会把函数写成:

fn as_u8_slice(xs: &[i32]) -> &[u8] {
    unsafe {
        std::slice::from_raw_parts(v.as_ptr() as *const u8, 
                                   v.len() * std::mem::size_of::<i32>())
    }
}

也就是说,我觉得调用函数在所有情况下都是安全的,但是函数内部的作用无法验证编译器。但是,对于何时适合使用其中一种或另一种,我没有任何规则。

将函数标记为 unsafe 当且仅当该函数的安全性取决于其参数或全局状态。如果无论参数和全局状态如何,函数都是安全的,请不要将其标记为 unsafe。您是否认为使用 unsafe 的函数内部安全与您是否认为 C 程序安全是一样的。

unsafe 被设计为一种本地机制,用于在编译器无法证明安全性时绕过类型系统。如果 unsafe 封装的行为是安全的,即没有办法调用它会导致内存不安全,那么就没有必要将整个函数标记为不安全。用户不需要关心函数内部是完全用安全代码还是用unsafe实现的,只要暴露的接口是正确的。