我最近在C上answered a question,其中我建议打开所有编译器警告。
我认为我会复制粘贴我确信gcc在编写OP代码时会给出的实际警告。
除了之外。我将其归结为此测试用例,但也无效:
int main() {
int a; /* not initialised */
while (a) { /* warn me! */
a++;
}
return 0;
}
我会在gcc
上写下我的最后一分钱:
test.c: In function ‘main’:
test.c:4:6: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
while (a) {
^
... 我会丢失。我没有得到任何警告!然而,如果我使用if
代替while
,为什么是,然后我得到的确是警告。但是while
?纳瑞低声说道。
我检查了一些似乎有密切关系的reports,并得出结论,虽然它们不适用,但gcc
可能会发生某事,这使警告变得多余只是这一个案例。我想知道是什么。
是因为a
被初始化为0吗?不,因为
int main() {
int a;
if (a == 0) { printf("a is zero\n"); }
while (a == 0) { a = printf("a is zero\n"); }
return 0;
}
在if()上给出了错误,但如果我对if()out进行注释,则不会给出错误。如果gcc知道a将会是0,那么第一个if也应该没有引起错误。
那么这里发生了什么?
答案 0 :(得分:3)
这不是错误。这是一个实施质量问题。如果我们查看manual,则说明:
请注意,可能没有关于仅使用的变量的警告 计算一个从未使用过的值,因为这样 在警告之前,可以通过数据流分析删除计算 印刷。
确实如下:
int b = a++;
会引发警告。
main.cpp:6:16: warning: variable 'a' is uninitialized when used here [-Wuninitialized]
while (a) { /* warn me! */
^
main.cpp:4:14: note: initialize the variable 'a' to silence this warning
int a; /* not initialised */
^
= 0
原始示例有printf
,但这令人困惑,因为它暗示了与“as-if”规则的关系。
真的,你能做的最好的事情是:
接受关于每种可能情况的警告等同于解决暂停问题
向开发者报告并希望他们为此做点什么
使用替代方案。 Clang 提供警告
从GCC维基看"Better Uninitialized Warnings"。支持该项目。请记住,硬币有两面。 GCC is notorious for bogus warnings也是如此。