相关疑难解决方法(0)

"未定义的行为"真的允许*发生任何事情吗?

编辑:这个问题并不是一个讨论未定义行为的(de)优点的论坛,但这就是它的变化.在任何情况下,这个关于假设的C编译器没有未定义行为的线程可能对那些认为这是一个重要主题的人更感兴趣.


当然,"未定义行为"的经典伪装例子是"鼻子恶魔" - 物理上是不可能的,无论C和C++标准允许什么.

因为C和C++社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序完全做任何事情的想法,所以我假设标准没有任何限制关于行为,以及未定义的行为.

C++标准中相关引用似乎是:

[C++14: defns.undefined]: [..]允许的未定义行为包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止转换或执行(发布诊断信息).[..]

这实际上指定了一小组可能的选项:

  • 忽略这种情况 - 是的,标准继续说这会产生"不可预测的结果",但这与编译器插入代码不同(我认为这是一个先决条件,你知道,鼻子恶魔).
  • 以文件化的方式表现环境 - 这实际上听起来相对温和.(我当然没有听说过任何有关鼻腔恶魔的记录.)
  • 终止翻译或执行 - 使用诊断,不能少.那个UB会表现得那么好吗?

我假设在大多数情况下,编译器选择忽略未定义的行为; 例如,当读取未初始化的内存时,可能是插入任何代码以确保一致行为的反优化.我认为陌生人类型的未定义行为(例如" 时间旅行 ")将属于第二类 - 但这需要记录这些行为并"环境特征"(所以我猜鼻腔恶魔只能由地狱计算机?).

我误解了这个定义吗?这些仅仅是可能构成未定义行为的例子,而不是一个全面的选项列表吗?"任何可能发生的事情"的说法仅仅意味着忽视这种情况的意外副作用吗?

编辑:两个小问题澄清:

  • 我认为从原始问题中可以清楚地看出,我认为对大多数人来说都是如此,但无论如何我都会拼出来:我确实意识到"鼻子恶魔"是诙谐的.
  • 请不要写的(其他)答案解释UB允许特定于平台的编译器优化,除非你解释它是如何允许的优化,实现定义的行为也不会允许.

c c++ undefined-behavior language-lawyer

93
推荐指数
6
解决办法
6796
查看次数

在常量表达式中除以零

如果我在常量表达式中除以零,我的玩具编译器会崩溃:

int x = 1 / 0;
Run Code Online (Sandbox Code Playgroud)

C和/或C++标准是否允许这种行为?

c c++ compile-time-constant divide-by-zero constant-expression

43
推荐指数
3
解决办法
4102
查看次数