Rust 如何决定何时将函数标记为不安全?
什么时候将函数标记为Rust 如何决定何时将函数标记为不安全?,rust,Rust,什么时候将函数标记为不安全与仅使用不安全块比较合适?我在阅读时看到了这个函数: 不安全的fn as_u8_切片(xs:&[i32])->&[u8]{ std::slice::from_raw_parts(v.as_ptr()as*const u8, v、 len()*std::mem::size_of::()) } 我可能会将函数编写为: fn as_u8_slice(xs: &[i32]) -> &[u8] { unsafe { std::sli
不安全
与仅使用不安全
块比较合适?我在阅读时看到了这个函数:
不安全的fn as_u8_切片(xs:&[i32])->&[u8]{
std::slice::from_raw_parts(v.as_ptr()as*const u8,
v、 len()*std::mem::size_of::())
}
我可能会将函数编写为:
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>())
}
}
fn作为u8切片(xs:&[i32])->&[u8]{
不安全{
std::slice::from_raw_parts(v.as_ptr()as*const u8,
v、 len()*std::mem::size_of::())
}
}
也就是说,我觉得调用函数在所有情况下都是安全的,但是编译器无法验证函数内部的功能。但是,我没有任何规则来说明何时使用一个或另一个函数是合适的。将函数标记为
unsafe
if如果函数的安全取决于其参数或全局状态。如果不管参数和全局状态如何,函数都是安全的,不要将其标记为不安全
。是否考虑使用<代码>不安全> /COD>内部安全的函数与您认为C程序是否安全相同。< P> <代码>不安全< /COD>被设计为本地机制,当编译器无法证明安全时,绕过类型系统。如果不安全
封装的行为是安全的,也就是说,没有办法调用会导致内存不安全的行为,那么就不需要将整个函数标记为不安全。只要公开的界面是正确的,用户无需关心函数内部是完全用安全代码实现还是用不安全的。事实上“调用函数在所有情况下都是安全的”应该是准确的标准。
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>())
}
}