GCC -Wuninitialized / -Wmaybe -ininitialized问题

我正在使用gcc-4.7 (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2遇到一个非常奇怪的问题。 我没有警告就无法编译以下有效代码:

 extern void dostuff(void); int test(int arg1, int arg2) { int ret; if (arg1) ret = arg2 ? 1 : 2; dostuff(); if (arg1) return ret; return 0; } 

编译选项和输出:

 $ gcc-4.7 -o test.o -c -Os test.c -Wall test.c: In function 'test': test.c:5:6: warning: 'ret' may be used uninitialized in this function [-Wmaybe-uninitialized] 

但是,以下代码编译时没有警告(虽然组装效率稍低):

 extern void dostuff(void); int test(int arg1, int arg2) { int ret; if (arg1 && arg2) ret = 1; if (arg1 && !arg2) ret = 2; dostuff(); if (arg1) return ret; return 0; } 

我有点卡住,我认为这是一个编译器错误。 有什么想法吗?

实际上,这是gcc中的一个已知问题。
gcc因报告错误的未初始化变量而臭名昭着。
这些缺点已得到适当注意,并且有一项克服缺点的倡议:
更好的未初始化警告 :

GNU Compiler Collection使用选项-Wuninitialized警告未初始化变量的使用。 但是,目前的实施方案存在一些明显的缺点。 一方面,一些用户希望更详细和一致的警告。 另一方面,一些用户希望获得尽可能少的警告。 该项目的目标是实现两种可能性,同时提高当前的能力。

该计划旨在提供更好的警告,并引用与您的案例类似的示例案例。 相关部分是:

对于特定用户,用户理解为误报的可能是不同的。 一些用户对由于优化器的操作与当前环境相结合而隐藏的情况感兴趣。 但是,许多用户不是,因为这种情况是隐藏的,因为它不会出现在编译的代码中。 典型的例子是

 int x; if (f ()) x = 3; return x; 

其中’f’总是为当前环境返回非零值,因此,它可以被优化掉。 在这里,一组用户希望获得未初始化的警告,因为“f”在其他地方编译时可能返回零。 然而,其他用户组会考虑对正在编译的可执行文件中不会出现的情况发出虚假警告。