【发布时间】:2020-05-15 02:41:09
【问题描述】:
我使用 Visual Studio 2019 编译了简单的 UB 代码,没有任何警告或错误:
int main()
{
int i = 10;
i = i++ + ++i;
return i;
}
我已打开 EnableAllWarnings(/Wall) 并将警告视为错误 (/WX) 标志。 编译成:
mov eax,17h
ret
因为编译器生成了这段代码,我确信他检测到了 UB。 为什么 MSVC 不生成任何关于 UB 的警告?
我已经检查了 Clang 和 GCC 是否为这个示例提供了警告。 他们是否会为任何可能的 UB 生成警告?如果是这样,为什么 MSVC 没有?
【问题讨论】:
-
在未定义行为的情况下,允许编译器做他想做的事
-
编译器不需要报告 UB。
-
你确定它“检测到”了 UB 是什么?
23(十进制)似乎没有检测到任何特殊值。 -
编译器没有检测到未定义的行为。它在编译时计算结果,因为它是一个经过优化的简单表达式。由于计算是未定义的行为,因此结果可以是任何东西。
标签: c++ visual-studio compiler-warnings undefined-behavior