关于C#:使用/ RTC1编译时,有时会禁止警告C4701

Warning C4701 is sometimes suppressed when compiling with /RTC1

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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;
}

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

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

但是,当我取消注释main()中的作业时,将不再发出警告。我正在使用/RTC1命令行选项进行编译以启用运行时错误检查:

1
cl.exe /RTC1 warning.cpp

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

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

编辑:令人费解的是,只有buffer[0] = 0;不在注释中,警告才会消失。


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

请注意,当您执行愚蠢的操作时,编译器可能会发出警告。当您执行某些愚蠢的操作时,它也可能会生成代码以在运行时崩溃。只是永远不要依赖它。它无法检测所有内容,您必须自己了解规则。