使用/ RTC1编译时,有时会禁止警告C4701

Geo*_*kov 8 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;
}
Run Code Online (Sandbox Code Playgroud)

发出以下警告(如预期):

f:\d\warning.cpp(13) : error C4701: potentially uninitialized local variable 'p' used
Run Code Online (Sandbox Code Playgroud)

然而,当我取消分配main(),警告不再给出.我正在使用/RTC1命令行选项进行编译以启用运行时错误检查:

cl.exe /RTC1 warning.cpp
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:令人费解的是,警告只有在buffer[0] = 0;没有评论时才会消失.

Jes*_*uhl 1

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

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

  • 我非常同意你的评论。但这里的问题是:警告在开发人员使用的调试版本中被抑制,并在构建服务器制作的发布版本中弹出。 (2认同)