在编译阶段扩展"未定义行为"的原因是什么?

Ale*_*xey -1 c++

在编译阶段扩展UB的原因是什么?遇到UB代码时,不是编译和链接二进制文件,而是让二进制文件服从UB?(如果不可能生成二进制文件,那么只需打印一条关于它的错误消息.)

毕竟,我们期望从编译器的最确切的报告汇编即使在源代码中包含UB-代码(几乎每件的源代码可能包含一些UB-代码).

您能给这样的UB-代码一个具体的例子,这确实更有道理,让编译器表现出UB比让生成的二进制表现出UB?

这个问题源于这一点:"未定义的行为"是否扩展到编译时?

Lig*_*ica 8

你觉得处理"未定义的行为"听起来像是编译器采取的某种特定操作.它会扫描你的程序中的"未定义行为",然后做一件事.因此,它可以选择构建(或执行过程)的哪个阶段来执行该操作并显示"未定义的行为".

它不是,它没有,它不能.

如果您的程序违反了合法且有用地假定的工具链已被维护的合同,则该程序具有未定义的行为.某些类别的错误导致程序具有未定义的行为(而不是形成错误)的重点是编译器不需要分析程序来查找它们(在许多情况下,它将是至多是不切实际的).它可以并且只会假设它们不在那里并相应地进行其复杂的业务(像这样).此业务涉及分析,翻译和生成稍后执行的代码 - 即合同违规与程序的整个生命周期相关.

因此,症状可以在程序生命周期的任何部分出现,从源代码的初始解析到翻译的二进制文件的执行.因此,没有人"扩展"UB,没有人就症状何时出现做出任何决定.所以没有理由,也没有理由.

  • @Alexey不,标准没有提到任何合同,标准是合同.它定义了编译器在不进行分析的情况下可以对代码进行的假设.标准中提到了工具链,但使用的术语是"符合实现". (4认同)

归档时间:

查看次数:

162 次

最近记录:

6 年,9 月 前