何时将函数标记为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>())
}
Run Code Online (Sandbox Code Playgroud)
我可能会把这个函数写成:
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>())
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我觉得在所有情况下调用函数都是安全的,但编译器无法验证函数内部的功能.但是,我没有任何关于何时适合使用其中一个的规则.
rig*_*old 13
将函数标记为unsafe函数的安全性取决于其参数或全局状态.如果函数是安全的,无论参数和全局状态如何,请不要将其标记为unsafe.您是否认为使用unsafe内部安全的功能与您是否认为C程序安全相同.
unsafe被设计为当编译器无法证明安全时绕过类型系统的本地机制。如果封装的行为unsafe是安全的,即没有调用的方法会导致内存不安全,那么就没有必要给整个函数打上不安全的标签。unsafe只要公开的接口是正确的,用户就不需要关心函数内部是完全用安全代码还是用 实现的。