取消挥发性零指针值不确定的行为?

问题描述 投票:0回答:2
评论

实际上是由于

dr1102的结果被删除的,陈述的推理是放弃零指针并不是不确定的行为。

指示它可能是定义的行为。 ceneral协议
认为这是不确定的行为。

打电话cv::setBreakOnError(true)

error()

if(breakOnError) { static volatile int* p = 0; *p = 0; }

*可以在typeid(*p)
上引起违反访问的行为吗?它的IMPLEMENTITATION
如下: *p

或调用此函数意味着,由于行为不确定,现在可以在编译和运行我的程序时发生任何事情?
我自己的最佳猜测是,它在技术上是未定义的,但是windows和linux上的正确的东西总是(?)

取消给无效指针值的原因说不是不确定的,是因为他们使用“删除”来表示将操作员应用于指针上,而不是实际上试图访问尖头对象。 dr1102

您链接到与232
c++ debugging volatile access-violation null-pointer
2个回答
8
投票
bad_typeid

。当

foo = *p
是多态类型类型时,对此进行评估以抛出异常。这是行为的定义,因此行为不是不确定的。

实际上试图访问注射指针的指针将不确定;

*p = 0nullptr将不确定。

eDIT:
根据Eric在评论中仍然是不确定的行为,因为删除A
volatile
与访问基础对象不同,无论存在如何,答案的其余部分都是我对标准的原始解释。

这里的要点是它是指向

volatile
对象的指针,该对象由标准指定。这取决于编译器如何实施它。

[decl.type.cv.5]

0
投票

没有内存保护的系统(一些嵌入式设备),您可以写入地址为零,并且该系统不会(立即)崩溃。 您不能使用标准来对此代码进行推理,只有编译器/OS文档。它似乎在目标操作系统/编译器上正常工作,这就是为什么volatile

被标准指定的全部原因。
如果指针不适合
volatile

,那将是不确定的行为,并且编译器将被允许执行任何操作,包括删除此内存访问或在其之前打破代码。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.