Jea*_*bre 14 c gcc compiler-warnings
如何在序列反转程序中修复此分段错误再一次是一个愚蠢的未初始化的变量错误?.
所以我打算重复"请使用-Wall
标志"评论,但当我测试代码反对警告时,我发现没有任何警告报告给我的惊喜.
所以我把它修改为下面这个(这段代码对执行目的毫无意义,但它说明了我想要展示的内容):
#include <stdio.h>
int main()
{
int i,len=12;
/* printf("%d\n",i); */
while(i!=len-1)
{
i++;
len--;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc
4.7.3和6.2.1 编译时
gcc -Wall -Wextra -pedantic
Run Code Online (Sandbox Code Playgroud)
我没有得到任何警告,而i
在while
循环中使用之前公然没有初始化.
现在如果我取消注释printf
我得到的陈述:
warning: 'i' is used uninitialized in this function [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)
那么,为什么经过时发出警告,i
要printf
,但不是在while
考验?
(不同的gcc没有警告未初始化的变量,因为在我的情况下,没有分支)
(听起来像一个小虫,但它是如此微不足道,我想知道我是不是错过了一些巨大的东西.)
小智 7
很难说它是一个错误,因为gcc
混合代码进行优化和创建警告,甚至记录了这个特定的警告:
-Wuninitialized
如果在未首先初始化的情况下使用自动变量或者如果变量可能被setjmp调用破坏,则发出警告.[...]
因为这些警告取决于优化,所以存在警告的确切变量或元素取决于所使用的GCC的精确优化选项和版本.
(从GCC docs 选项到请求或抑制警告,强调我的)
你在这里找到了一个非常愚蠢的恕我直言 尝试-O1
,你会得到一个意外的警告:
warn.c: In function ‘main’:
warn.c:13:6: warning: ‘i’ may be used uninitialized in this function [-Wmaybe-uninitialized]
i++;
^
Run Code Online (Sandbox Code Playgroud)
所以,gcc
仍然错过了第一个未初始化的使用,但发现了第二个!尝试-O0
或-O2
警告再次消失......
您仍然可以尝试提交有关此问题的错误.请注意clang
正确:
warn.c:10:9: warning: variable 'i' is uninitialized when used here
[-Wuninitialized]
while(i!=len-1)
^
warn.c:6:8: note: initialize the variable 'i' to silence this warning
int i,len=12;
^
= 0
1 warning generated.
Run Code Online (Sandbox Code Playgroud)