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没有区别
这是非常不同的,如果把函数看作黑盒子,那么:
@信任函数使用起来一般是由人类审查者,因为编译器不能分析它,来保证安全的.注意,函数处理其输入/输出数据是相当简单的.
@系统函数可能有些危险怪癖,很容易误用它而犯错(泄漏资源,输入错误时出现段错误,从多线程使用时出现死锁),如果用户非常小心,可正确使用,但直接允许从@安全代码调用会很鲁莽.

posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示