【发布时间】:2017-07-15 05:35:23
【问题描述】:
我可以理解保留定义的实现,以便实现它的特定人员知道最好发生什么,但为什么某些事情会是未定义的行为?为什么不直接说,还有什么是实现定义的?
【问题讨论】:
-
实现定义意味着必须记录行为,因此必须保持一致。未定义的意思是“没有规则”。
-
@BoPersson-- 我认为 OP 正在寻找理由。
-
基本的答案是编译器可以优化假设未定义的行为永远不会发生。其影响基本上无法预测,因此无法记录(这是“定义”所必需的)。有关示例,请参见 gcc.gnu.org/bugzilla/show_bug.cgi?id=33498。
-
如果您要为所有情况定义行为,则必须为它们检查。其中一些无法被检查,另一些没有有意义的解决方案(“永远不要检查你不知道如何处理的错误情况”),另一些仍然太苛刻而无法检查。对于这些情况,语言标准允许行为保持“未定义”,这允许更容易、更快地实现编译器和库。 (简单示例,
strcpy()。您无法检查所涉及的字符串是否正确地以零结尾。如果不是,则行为未定义。) -
@MartinBonner 不,这绝对不是原因。只是 gcc 选择以这种方式解释它,这反过来又使它在某些情况下成为一个不太有用的编译器(想到了严格的别名违规)。
标签: c++ c language-lawyer undefined-behavior