d的@safed不阻止解引用空引用

原文

void main(immutable string[] argv) @safe @live {
    class Test {
        string a;
    }
    auto testInstance = new Test;
    testInstance.a = "Test String";
    import std.stdio;
    testInstance.a.writeln;
    testInstance = null;
    testInstance.a.writeln;
}
/* 终端输出:
    Test String
    Segmentation fault
*/

当然,这段代码必须抛分段错误,因为解引用null非法的.但是,问题是,它让我可以在@safe中编译程序.
我不完全确定testInstance的定义,但假定是个引用.在SafeD中应禁止解引用null.或这是D的设计决定?
我相信这是设计决定,因为在@safe代码中,你没有调用UB.解引用null指针肯定会使你程序崩溃,因此在@safe代码中允许它,因为语义确定的.

哦,我现在明白了.所以猜想D中的@safe只防止UB,而不是所有可能内存错误,并且由于解引用null总是会导致页面错误,所以它不是UB.
这是正确的.

请解释.是因为null+offset会导致数据损坏,但它甚至允许在安全模式下使用吗
几个平台甚至没有页面错误.
如,Webassembly就像其他地址一样,使用0地址作为普通地址,
应该禁止safeD使用原始指针,并且需要不透明的托管指针和D3?

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