当然,“未定义行为”的经典虚构例子是“鼻腔恶魔”ーー不管 C 和 C + + 标准允许什么,这在物理上是不可能的。
因为 c 和 c + + 社区倾向于强调未定义行为的不可预测性,以及编译器允许程序在遇到未定义行为时按照字面意思 什么都行运行的想法,所以我假设该标准对未定义行为的行为没有任何限制。
允许的未定义行为范围包括完全忽略情况和不可预测的结果,在翻译或程序执行过程中以有记录的方式表现出环境特征(有或没有发出诊断信息) ,以及终止翻译或执行(发出诊断信息)。[..]
这实际上指定了一小组可能的选项:
I assume that in most cases, compilers choose to ignore the undefined behavior; for example, when reading uninitialized memory, it would presumably be an anti-optimization to insert any code to ensure consistent behavior. I suppose that the stranger types of undefined behavior (such as "时间旅行") would fall under the second category--but this requires that such behaviors be documented and "characteristic of the environment" (so I guess nasal demons are only produced by infernal computers?).
我理解错了吗?这些建议是否仅仅是构成未定义行为的 例子,而不是一份全面的备选方案清单?“任何事情都有可能发生”的说法是否仅仅意味着忽视这种情况会带来意想不到的副作用?
有两点需要澄清:
这个问题并不是为了讨论未定义行为的(反)价值而设计的论坛,但事实就是如此。在任何情况下,对于那些认为 这个线索是关于一个没有未定义行为的假想的 C 编译器是一个重要话题的人来说,这个线索是关于一个没有未定义行为的假想的 C 编译器都可能是一个额外的兴趣。