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

9
什么情况下应将函数标记为“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>())
    }
}

也就是说,我感觉在所有情况下“调用函数”是安全的,但是编译器无法验证函数内部实际执行了什么。然而,我没有任何规则来确定何时使用其中之一。


5
“在所有情况下调用该函数是安全的”这一事实应该是精确的标准。 - Tupshin Harper
2个回答

17
将函数标记为unsafe,当且仅当函数的安全性取决于其参数或全局状态。如果函数不管参数和全局状态都是安全的,则不要将其标记为unsafe。无论您是否认为使用unsafe的函数在内部是安全的,这与您是否认为C程序是安全的相同。

5

unsafe是一种本地机制,用于在编译器无法证明安全性时绕过类型系统。如果由unsafe封装的行为是安全的,即没有任何调用方式会导致内存不安全,则无需将整个函数标记为unsafe。只要公开的接口正确,用户无需关心函数内部是完全使用安全代码实现还是使用unsafe实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接