use*_*062 14 c c++ gcc gcc-warning compiler-optimization
我正在经历一个非常奇怪的问题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;
}
Run Code Online (Sandbox Code Playgroud)
编译选项和输出:
$ 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]
Run Code Online (Sandbox Code Playgroud)
但是,以下代码编译时没有警告(虽然组装效率稍低):
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;
}
Run Code Online (Sandbox Code Playgroud)
我有点卡住,我认为这是一个编译器错误.有什么想法吗?
Alo*_*ave 18
实际上,这是gcc中的一个已知问题.
gcc因报告错误的未初始化变量而臭名昭着.
这些缺点已得到适当注意,并且有一项克服缺点的举措:
更好的未初始化警告:
GNU Compiler Collection警告使用该选项使用未初始化的变量
-Wuninitialized.但是,目前的实施有一些明显的缺点.一方面,一些用户想要更详细和一致的警告.另一方面,一些用户希望获得尽可能少的警告.该项目的目标是实现两种可能性,同时提高当前的能力.
该计划旨在提供更好的警告,并引用与您的案例类似的示例案例.相关部分是:
用户理解为误报可能对于特定用户而言是不同的.一些用户对由于优化器的操作与当前环境相结合而隐藏的情况感兴趣.但是,许多用户不是,因为这种情况是隐藏的,因为它不会出现在编译的代码中.典型的例子是
int x;
if (f ())
x = 3;
return x;
Run Code Online (Sandbox Code Playgroud)
其中'f'总是为当前环境返回非零值,因此,它可以被优化掉.在这里,一组用户希望获得未初始化的警告,因为"f"在其他地方编译时可能返回零.然而,其他用户组会考虑虚假警告,说明编译的可执行文件中不会出现这种情况.