【发布时间】:2011-02-15 20:11:55
【问题描述】:
由于未定义的行为,许多不好的事情发生并继续发生(或者没有,谁知道,任何事情都可能发生)。我知道这是为了给编译器优化留出一些回旋余地,也可能是为了让 C++ 更容易移植到不同的平台和架构。然而,由未定义行为引起的问题似乎太大而无法通过这些论点来证明。未定义行为的其他论据是什么?如果没有,为什么还存在未定义的行为?
编辑 为我的问题添加一些动机:由于与较少 C++ 狡猾的同事的几次糟糕经历,我已经习惯于使我的代码尽可能安全。断言每一个论点,严格的 const 正确性和类似的东西。我尽量留出尽可能少的空间以错误的方式使用我的代码,因为经验表明,如果有漏洞,人们会使用它们,然后他们会打电话给我说我的代码不好。我认为让我的代码尽可能安全是一种好的做法。这就是为什么我不明白为什么存在未定义的行为。谁能给我一个在运行时或编译时无法检测到的未定义行为示例,而无需大量开销?
【问题讨论】:
-
这些天来,未定义的行为似乎风靡一时……春天的哲学精神?
-
如果您将所有编译时“未定义行为”替换为“不应翻译”,并将所有运行时“未定义行为”替换为“调用 abort()”或类似内容,作为应用程序编写者,您d 仍然必须避免导致它的任何构造。如果您想在某些情况下将行为定义为不那么激烈,那么无论您是否有 UB 都没有什么不同。在目前对实现没有要求的情况下,您必须定义(并让其他所有人同意)行为。
-
@Matthieu M.:目前可以观察到的这种愤怒激发了这个问题。
-
就像今天一样,@Charles,如果你不小心调用了未定义的行为,你可能会得到一个在一个系统上完全按照预期工作的程序,但它在另一个系统上返回了微妙的错误答案。如果定义了未定义的行为,那么至少您会立即知道出现了问题,无论是由于崩溃还是由于始终错误的结果。
-
@CharlesBailey:如果一个程序应该将视听文件从一种格式转换为另一种格式,如果格式错误的输入文件生成充满“随机”像素和声音的输出文件,或者它们导致程序退出,但这并不意味着他们可以重新格式化硬盘。允许代码指定在溢出的情况下哪些行为可以接受和不可以接受,这将允许一些简单的优化,远远超出在严格检查所有输入以确保不会发生溢出的程序上可能实现的优化。