d信任与rust不安全的区别
use std::slice;
unsafe fn f(i: usize) -> i32 {
let mut arr = [1, 2, 3];
let s = slice::from_raw_parts_mut(arr.as_mut_ptr(), 1000);
return s[i];
}
fn main() {
unsafe { println!("{}", f(3)); } // ok!
}
上面为rust不安全版,下面为D对应不安全版:
@safe: import std;
@system int f(size_t i) {
auto arr = [1, 2, 3];
return arr.ptr[i];
}
void main() {
() @trusted { writeln(f(3)); }(); // ok!
}
Rust和D编译器都直接接受了这些代码.可能在不知不觉中,就把代码编译到你的库中.如果bug很难重现,你甚至找不到它.
现在,如果回顾代码,那么D代码比Rust代码可读性强得多.如果想在D代码中找到安全和不安全代码之间的边界,那么可只搜索"@trusted"属性.但是在Rust代码中,你很难找到它,因为相同"unsafe"关键字有多个用途.
:@trusted与@system没有区别
这是非常不同的,如果把函数看作黑盒子,那么:
@信任函数使用起来一般是由人类审查者,因为编译器不能分析它,来保证安全的.注意,函数处理其输入/输出数据是相当简单的.
@系统函数可能有些危险怪癖,很容易误用它而犯错(泄漏资源,输入错误时出现段错误,从多线程使用时出现死锁),如果用户非常小心,可正确使用,但直接允许从@安全代码调用会很鲁莽.
浙公网安备 33010602011771号