【发布时间】:2020-01-10 19:06:06
【问题描述】:
gcc 编译器忽略 uninitialized variable warning 进行调试构建。这对我来说看起来很奇怪,有人可以帮助我理解这一点吗?
## Program
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, max;
int count;
if (argc < 2) {
return -1;
}
max = atoi(argv[1]);
for (i = 0; i < max; i++) {
count++;
}
printf("count is %d\n", count);
return 0;
}
gcc a.c -g -Wall -Werror
没有警告
gcc a.c -O3 -Wall -Werror
a.c: In function ‘main’:
a.c:8:9: error: ‘count’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
int count;
^~~~~
cc1: all warnings being treated as errors
gcc 版本:7.4.0
【问题讨论】:
-
在优化过程中会进行一些静态代码分析。因此,某些警告只有在设置了某个优化级别时才可用。这是其中一种情况。
-
为什么不使用
gcc a.c -O3 -g -Wall -Werror(并在你使用它时输入-Wextra,也许还有其他一些警告标志)。这让你两全其美——调试信息和优化。我大部分时间都使用这种组合。这确实意味着,如果您必须运行调试器,当优化器移动或删除代码时,您可能会遇到一些奇怪的行为。但它在大多数情况下确实有效。如果您要进行认真的调试会话,请删除-O3— 否则,请同时使用。
标签: c gcc gcc-warning