这段代码(注意注释行):
#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位版本的编译器。两者都产生了相同的行为。
问题是:这是编译器错误,还是有解释?微软的文档提到/ RTC1可能会在给出C4701的地方给出运行时错误,但它没有说明警告被抑制。
编辑:令人费解的是,警告仅在buffer[0] = 0;
没有评论时才会消失。
答案 0 :(得分:1)
在很多情况下,某些东西是次优的,可能是错误的,甚至是未定义的,编译器很难检测到这种情况。因此,您不应该依赖警告(和/或由编译器工具触发的运行时错误)来为您提供完整的真相。
当你做一些愚蠢的事情时,知道编译器可能会发出警告。当你做一些愚蠢的事情时,它也可能生成代码以在运行时爆炸。永远不要依赖它。它无法检测到所有内容,您必须自己了解规则。