“未定义的行为”真的允许*任何事情发生吗?
这个问题并不是用来讨论未定义行为的优点的论坛,但它就是这样的。无论如何,这个线程是关于一个假设的C-编译器,没有未定义的行为。对于那些认为这是一个重要话题的人来说,可能会有更多的兴趣。
典型的“未定义的行为”的例子,当然是“鼻涕鬼”-不管C和C+标准允许什么,都是一种生理上的不可能。
因为C和C+社区倾向于强调未定义行为的不可预见性,以及编译器允许程序按字面顺序执行的想法。什么都行当遇到未定义的行为时,我假设标准对未定义行为的行为没有任何限制。
但C+标准中的相关引用似乎是:
[C++14: defns.undefined]:
[..]允许的未定义行为包括:完全忽略这种情况而导致不可预测的结果;在翻译或程序执行过程中以具有环境特征的记录方式(无论是否发布诊断消息);终止翻译或执行(通过发布诊断消息)。[..]
这实际上指定了一组可能的选项:
无视形势
-是的,标准接着说这会有“不可预测的结果”,但这和编译器不一样插入
代码(我认为这是鼻腔恶魔的先决条件)。以有文件记录的方式行事,具有环境特征
-实际上,这听起来比较温和.(我当然没有听说过任何有记录的鼻涕病例。)终止翻译或执行
-用诊断法,也一样.如果所有的UB都能表现得这么好。
我假设在大多数情况下,编译器选择忽略未定义的行为;例如,在读取未初始化的内存时,插入任何代码以确保行为一致可能是一种反优化。我认为陌生人的未定义行为类型(如“时间旅行)将属于第二类-但这需要记录这些行为和“环境特征”(因此,我猜鼻恶魔只是由地狱的计算机产生的?)。
我是不是误解了定义?这些仅仅是实例什么可以构成未定义的行为,而不是一个全面的选项列表?所谓“任何事情都可能发生”的说法是否仅仅意味着无视形势的意外副作用?
编辑:有两点需要澄清:
- 我认为从最初的问题中可以看出这一点,我认为对大多数人来说都是如此,但我还是会说出来的:我确实意识到“鼻涕鬼”是开玩笑的。
- 请不要写(其他)答案,说明ub允许特定于平台的编译器优化,除非您
也
解释它是如何允许优化的执行-定义
行为不会
允许。