嵌套的未定义行为是否可以消除初始未定义行为的(潜在)危害



在嵌套未定义行为的情况下:

  1. 后续未定义的行为之一是否会导致取消初始未定义行为的(潜在(危害
  2. 所有后续未定义行为的组合是否会导致取消最初未定义行为(潜在(的危害

是否有实践中的例子表明,由于存在嵌套的未定义行为,取消了(巧合的(初始未定义行为的危险?

您认为未定义的行为是错误的。它不是";已经发生的事情,你可以分析什么";。它的";你的程序不再有任何保证,它现在似乎可以工作了。可能不会。只有当月亮圆的时候,它才能工作。当您更改编译器时,它可能会开始工作。它可能无法在不同的操作系统上工作&";。无论你有多少未定义行为的例子,它们都不能相互抵消。UB+UB是始终UB。

一旦你有了UB,任何事情都可能发生,包括它发生在工作中。无论您在原始源中有多少UB实例,这都是正确的。

然而,取一个由具有未定义行为的代码库生成的编译二进制文件,并分析该二进制文件的作用是可能的,你可以很容易地找到两个错误相互抵消的地方。最简单的例子可能是将数组的末尾覆盖到另一个忘记初始化的变量上。我真的见过这种事发生。

注意,如果你这样做,你仍然不能保证它是";好";。如果你升级了编译器或扰乱了系统(即使你只是重新编译(,那么下次编译器可能会选择不同的布局,导致新的二进制文件不起作用。

"未定义"只是意味着编译器和执行环境都不需要以任何特定的方式来处理这种情况。总体而言,UB是不可预测或不一致的;一旦你的程序调用了未定义的行为,你就取消了保修,所有的赌注都取消了

UB有点像墨菲定律——你不能让它对你有利。

UB可能有一些特定的实例会相互抵消,但你不能保证它们会用于任何特定的构建。您最好首先修复导致未定义行为的代码。

未定义行为,正如C和C++标准使用的术语一样,意味着标准对一致性实现在给定输入时的行为没有提出任何要求,这将导致它们尝试执行特定操作。事实上,一个特定的输入会导致程序调用UB,这意味着,从标准合规的角度来看,无论程序做什么,实现都不会使其不符合要求。

至于行为是否可预测,这取决于实现是否选择定义行为。根据C标准的作者,未定义的行为等;它还确定了可能的一致语言扩展领域:实现者可以通过提供官方未定义行为的定义来增强语言"几乎所有的质量实现都可以配置为以这种方式扩展语言的语义,尽管有些实现可能需要完全禁用许多优化,以避免出现质量优化器本可以轻松支持的情况。

关于您关于多种形式的UB交互的特定问题,实施可能会规定,当标准没有施加要求的某些特定行动之前有一些其他行动,而标准没有施加任何要求时,这些行动的行为将是可预测的。

最新更新