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
?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现