gpt4 book ai didi

c++ - "Undefined Behavior"真的允许*任何*发生吗?

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:40 25 4
gpt4 key购买 nike

<分区>

“未定义行为”的经典杜撰示例当然是“鼻恶魔”——无论 C 和 C++ 标准允许什么,这在物理上都是不可能的。

因为 C 和 C++ 社区倾向于强调未定义行为的不可预测性,以及允许编译器在遇到未定义行为时让程序按字面意义任何的想法,我曾假设该标准对未定义行为的行为没有任何限制。

但是relevant quote in the C++ standard seems to be :

[C++14: defns.undefined]: [..] Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message). [..]

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

  • 忽略这种情况 -- 是的,标准接着说这将产生“不可预测的结果”,但这与编译器插入代码不同(我认为这是鼻恶魔的先决条件)。
  • 以符合环境特征的记录方式行事 -- 这实际上听起来相对温和。 (我当然没有听说过任何记录在案的鼻恶魔案例。)
  • 终止翻译或执行 -- 带有诊断,不少于此。所有的 UB 都会表现得如此好吗。

我假设在大多数情况下,编译器会选择忽略未定义的行为;例如,当读取未初始化的内存时,插入任何代码以确保一致的行为可能是一种反优化。我想奇怪的未定义行为类型(例如“time travel”)将属于第二类——但这需要记录此类行为和“环境特征”(所以我猜鼻恶魔只产生通过该死的计算机?)。

我是不是误解了这个定义?这些是否只是作为可能构成未定义行为的示例,而不是选项的综合列表?声称“任何事情都可能发生”是否仅仅是忽视这种情况的意外副作用?

澄清两个小问题:

  • 我认为从最初的问题中可以清楚地看出这一点,而且我认为对大多数人来说都是如此,但我还是要说清楚:我确实意识到“鼻恶魔”是开玩笑的。
  • 请不要写一个(其他)答案来解释 UB 允许特定于平台的编译器优化,除非您解释它如何允许实现定义的优化行为不会允许。

这个问题的目的不是作为讨论未定义行为的(缺点)优点的论坛,但它确实变成了这样。无论如何,this thread about a hypothetical C-compiler with no undefined behavior那些认为这是一个重要主题的人可能会额外感兴趣。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com