我如何决定何时将函数标记为不安全?
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
实现的,只要暴露的接口是正确的。
什么时候将函数标记为 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
实现的,只要暴露的接口是正确的。