GCC -Wuninitialized / -Wmaybe,未初始化的问题(GCC -Wuninit

2019-07-17 18:34发布

我遇到使用一个非常奇怪的问题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;
}

我有点卡住,正在考虑这个编译器错误。 有什么想法吗?

Answer 1:

事实上,这是在GCC的已知问题。
GCC是臭名昭著的报告不正确初始化的变量
缺点已经充分注意到并有克服缺点的举措:
更好的未初始化警告 :

GNU编译器警告有关使用未初始化变量的选项-Wuninitialized 。 然而,目前的实现有一定的明显不足。 一方面,一些用户想更详细的和一致的警告。 在另一方面,一些用户想获得尽可能少的警告越好。 该项目的目标是同时实现的可能性,而在同一时间来提高目前的能力。

该倡议旨在提供更好的警告和它引用作为你的情况类似的一个例子情况。 相关部分的存在:

多么用户理解为误报可能是针对特定用户的不同。 一些用户感兴趣的是那些因为优化与当前环境相结合的行动隐蔽案件。 然而,许多用户都没有了,因为这种情况下是隐藏的,因为它不能在编译的代码出现。 典型的例子是

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

其中,“F”总是适合当前环境返回非零,并且因此,它可以被优化了。 在这里,一组用户想获得,因为“F”未初始化的警告时,其他地方可能编译回零。 然而,其他组的用户会考虑杂散关于不能在可执行文件会出现在编译的情况警告。



文章来源: GCC -Wuninitialized / -Wmaybe-uninitialized issues