How to fix this segmentation error in a sequence inverting program?中的一个愚蠢的未初始化变量错误。
所以我要重复“请使用-Wall
标志”评论,但是当我针对警告测试代码时,我发现没有任何警告报告给我的惊喜。
所以我将其修改为下面的内容(此代码对于执行目的没有意义,但它说明了我想要显示的内容):
#include <stdio.h>
int main()
{
int i,len=12;
/* printf("%d\n",i); */
while(i!=len-1)
{
i++;
len--;
}
return 0;
}
使用
使用gcc
4.7.3和6.2.1进行编译时
gcc -Wall -Wextra -pedantic
我没有收到任何警告,而在i
循环中使用之前,while
公然未被初始化。
现在,如果我取消注释我得到的printf
语句:
warning: 'i' is used uninitialized in this function [-Wuninitialized]
那么为什么在将i
传递给printf
而不是while
测试时会发出警告?
(它与gcc failing to warn of uninitialized variable不同,因为在我的情况下,没有分支)
(听起来像是一个错误,但它是如此微不足道,我想知道我是不是错过了一些巨大的东西。)
答案 0 :(得分:7)
很难说它是 bug ,因为gcc
混合了代码以进行优化和创建警告,甚至还记录了此特定警告:
-Wuninitialized
如果在未首先初始化的情况下使用自动变量或者如果变量可能被setjmp调用破坏,则发出警告。 [...]
由于这些警告取决于优化,因此存在警告的确切变量或元素取决于所使用的GCC的精确优化选项和版本。
(来自GCC docs Options to Request or Suppress Warnings,强调我的)
你在这里发现了恕我直言。试试-O1
,您会收到意外警告:
warn.c: In function ‘main’:
warn.c:13:6: warning: ‘i’ may be used uninitialized in this function [-Wmaybe-uninitialized]
i++;
^
所以,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.