考虑以下 C 程序:
#include <limits.h>
int main() {
int x = INT_MIN;
int y = -x;
return y;
}
该程序具有未定义的行为,因为 INT_MIN 的否定是不可表示的;或者,成为一名语言律师——因为 C 标准是这样说的。
现在,编译器知道或者可以知道,情况就是这样。然而 - GCC 和 clang 都没有对此发出警告,即使使用-W -Wall -Wextra
(GodBolt); 只有清理未定义的行为才能捕获它 - 在运行时。
为什么会这样?通常,试图证明 UB 发生在编译时是否成本太高,所以编译器不会打扰?