0
点赞
收藏
分享

微信扫一扫

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​​?


举报

相关推荐

0 条评论