8

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

#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命令行选项进行编译以启用运行时错误检查

cl.exe /RTC1 warning.cpp

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

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

编辑:令人费解的部分是警告仅在buffer[0] = 0;未发表评论时才会消失。

4

1 回答 1

1

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

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

于 2016-03-16T22:17:21.203 回答