MSVC C/C++ 编译器未定义行为警告
MSVC C/C++ compiler undefined behavior warning
我使用 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 没有?
Clang and GCC gives warnings for this example. Do they generate warnings for any possible UB?
没有。许多事物被定义为 "undefined behavior" 而不是需要诊断,正是因为它们极难(甚至在理论上被证明是不可能的)以 100% 的准确度检测。
假设代码是 *p = (*q)++ + ++(*r);
在这种情况下,编译器通常无法知道哪些指针组合(如果有的话)将标识相同的对象。虽然让编译器在像您这样的简单代码片段中发出诊断很简单,但与无法分离操作的可能性相比,任何人 意外 编写此类代码的可能性都相当小在碰巧标识相同对象的指针上。除非作者或维护者编写代码来执行此操作,否则编译器不会对构造发出诊断。虽然一些编译器的作者花费了大量精力来包括此类诊断,但许多其他人认为他们可能不得不花费的任何时间和精力包括此类诊断最好花在支持其他更有用的功能上。
在 clang 中你可以这样使用:
clang++ -fsanitize=undefined
test.cpp
程序运行时会报that
这样的错误
visual studio 已经 supports address_sanitizer。
似乎 UndefinedBehaviorSanitizer 将不得不 wait a while
我使用 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 没有?
Clang and GCC gives warnings for this example. Do they generate warnings for any possible UB?
没有。许多事物被定义为 "undefined behavior" 而不是需要诊断,正是因为它们极难(甚至在理论上被证明是不可能的)以 100% 的准确度检测。
假设代码是 *p = (*q)++ + ++(*r);
在这种情况下,编译器通常无法知道哪些指针组合(如果有的话)将标识相同的对象。虽然让编译器在像您这样的简单代码片段中发出诊断很简单,但与无法分离操作的可能性相比,任何人 意外 编写此类代码的可能性都相当小在碰巧标识相同对象的指针上。除非作者或维护者编写代码来执行此操作,否则编译器不会对构造发出诊断。虽然一些编译器的作者花费了大量精力来包括此类诊断,但许多其他人认为他们可能不得不花费的任何时间和精力包括此类诊断最好花在支持其他更有用的功能上。
在 clang 中你可以这样使用:
clang++
-fsanitize=undefined
test.cpp
程序运行时会报that
这样的错误visual studio 已经 supports address_sanitizer。 似乎 UndefinedBehaviorSanitizer 将不得不 wait a while