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?
浙公网安备 33010602011771号