格式错误的程序并不总是导致 UB(在编译时或 运行 时)是真的吗?

Is it true that ill-formed program does not always lead to UB (either at compile time or at run time)?

跟进:

以下table是否正确?

                  ===== leads to UB ====
program           compile time  run time
well-formed       never         may
ill-formed        may           may

如果程序格式错误,则需要具有足够资源来处理它的符合标准的实现来发出诊断。一旦实现完成,之后它可能做的任何事情都将超出标准的管辖范围。一些可能的结果是:

  1. 输出诊断后终止处理。

  2. 输出诊断后,就好像语言被扩展以允许任何构造,否则会使程序格式错误。

  3. 运行 程序的最后一个成功编译版本,其行为可能与当前源文件中的任何内容无关。

如果构造的特征是“格式错误;不需要诊断”,除了第四种可能性之外,上述所有情况仍然可能,即继续进行,就好像语言被扩展以允许构造而无需费心输出首先进行诊断。

由于该标准仅试图根据源文件的当前内容来描述程序行为,而不是它们在过去某个时间可能包含的任何内容,因此它无法有意义地描述如果提供一个实现可能会发生的情况格式错误的源文件。这并不意味着质量实施不应该试图避免意外执行过时版本的程序,但他们可能为此目的采取的任何措施都在标准的管辖范围之外。

请注意,在某些针对嵌入式或远程系统的实现中,选项 #3 可能并不像听起来那么荒谬。在许多情况下,构建和执行周期将涉及停止在远程系统上的执行,为其提供新代码,然后在该系统上重新启动执行。如果没有新的代码映像可用,那么在许多情况下重新启动之前存在的任何代码映像可能比让系统处于死机状态更有用,但是标准无法对程序的作用强加任何有意义的东西,这意味着由于构建新程序失败而导致的它的执行不能被描述为未定义行为以外的任何其他特征。