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

时间:2015-03-14 15:02:29

标签: rust

何时将函数标记为unsafe而不仅仅使用unsafe块是否合适?我在阅读another answer时看到了这个功能:

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>())
    }
}

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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

当编译器无法证明安全性时,

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