c++ - 使用/RTC1 编译时有时会抑制警告 C4701

标签 c++ visual-c++ compiler-bug cl

这段代码(注意注释行):

#include <malloc.h>

#pragma warning(error: 4701)

int main(){
    char buffer[1024];
    //buffer[0] = 0;

    void *p;
    int size = 1;
    if (size < 2)
        p = malloc(size);
    free(p); // C4701
    return 0;
}

给出以下警告(如预期的那样):

f:\d\warning.cpp(13) : error C4701: potentially uninitialized local variable 'p' used

但是,当我取消注释 main() 中的赋值时,不再给出警告。我正在使用 /RTC1 命令行选项进行编译以启用 run-time error checks :

cl.exe /RTC1 warning.cpp

我尝试了 Visual C++ 2013 和 2015 的最新 64 位编译器版本。两者都产生相同的行为。

问题是:这是一个编译器错误,还是对此有解释? Microsoft 的文档提到/RTC1 可能会在给出 C4701 的地方给出运行时错误,但它没有说明警告被抑制。

编辑: 令人费解的部分是警告仅在 buffer[0] = 0; 不在注释中时才会消失。

最佳答案

在很多情况下,有些东西不是最优的,可能有错误,甚至是未定义的,而编译器很难检测到这一点。因此,您不应依赖警告(和/或由编译器检测触发​​的运行时错误)来告诉您完整的真相。

要知道编译器可能会在你做傻事时发出警告。它还可能生成代码,当你做一些愚蠢的事情时,它会在运行时爆炸。永远不要依赖它。它无法检测所有内容,您必须自己了解规则。

关于c++ - 使用/RTC1 编译时有时会抑制警告 C4701,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35379053/

相关文章:

C++ 构造函数 : expected identifier before numeric constant

c++ - CStatic 自定义控件

windows - 是否有创建 MFC 错误对话框的常规/标准方法?

c++ - 错误 83 错误 C2398 : conversion from 'double' to 'float' requires a narrowing conversion

java - AspectJ 编译器错误导致 StackOverflowError

c++ - 传递参数以在 C++ 中 boost odeint

c++ - char_t 是 VS 中现有的全局 typedef 吗?

c++ - 谁在使用 MFC 的 VERIFY 宏?

c++ - VS2008 SP1 : No appropriate default constructor available when pushing a pair into vector

c++ - 如何检测我的软件是否在 Windows XP 上运行?