何时将函数标记为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>())
}
}
也就是说,我觉得调用函数在所有情况下都是安全的,但编译器无法验证函数内部的功能。但是,我没有任何关于何时使用其中一个的规则。
答案 0 :(得分:11)
如果函数的安全性取决于其参数或全局状态,则将函数标记为unsafe
。如果无论参数和全局状态如何,该函数都是安全的,请不要将其标记为unsafe
。您是否认为使用unsafe
内部安全的函数与您是否认为C程序安全相同。
答案 1 :(得分:4)
unsafe
被设计为一种本地机制来绕过类型系统。如果unsafe
封装的行为是安全的,即没有办法调用它会导致内存不安全,那么就不需要标记整体功能不安全。只要暴露的接口正确,用户无需关心函数内部是完全用安全代码实现还是用unsafe
实现。