为什么for循环中未初始化的声明没有任何警告?

5

我尝试使用g++(gcc版本4.8.2(Debian 4.8.2-1))编译以下代码,并带有-Wall标志(添加-Wextra标志对我来说没有任何影响)。

#include <iostream>

using namespace std ;

int main() {
    int i ;
    cout << i << endl ;
}

它发出了这个警告:
test.cpp: In functionint main()’:
test.cpp:7:13: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
    cout << i << endl ;

但是以下代码没有产生任何警告:
#include <iostream>

using namespace std ;

int main() {
    for(int i ; i < 10 ; i++) {
        cout << i << endl ;
    }
}

我进行了进一步的测试。

以下代码产生警告:

#include <iostream>

using namespace std ;

int main() {
    int i ;
    while(i<10) {
        cout << i << endl ;
    }
}

但是以下内容不行:
#include <iostream>

using namespace std ;

int main() {
    int i ;
    while(i<10) {
        cout << i << endl ;
        i++ ;
    }
}

在上面的程序中,如果我将while替换为if,那么就会出现警告。
是否有解释?为什么编译器在某些情况下能够识别问题,而在其他情况下却不能,尽管它们看起来非常接近?

编译时加上 -Wall -Wextra,会出现这样的警告信息:warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized] for(int i ; i < 10 ; i++) { - vsoftco
1
只需使用-Wall参数,就可以为我完成这个任务(http://coliru.stacked-crooked.com/a/58bc57b1ce9b4ed0)。请说明您的编译器版本,因为GCC已经有很多很多版本了。或者直接升级。 - Lightness Races in Orbit
这篇文章可能会(或者不会?)有所帮助:http://stackoverflow.com/questions/28551951/is-it-legal-to-increment-non-initialized-variable (尽管它的投票数很低,但是那里有一些好的答案。) - Serlite
我的版本:gcc版本4.8.2(Debian 4.8.2-1) - Tom Cornebize
Wextra标志对我来说没有任何改变。 - Tom Cornebize
相关 https://gcc.gnu.org/wiki/Better_Uninitialized_Warnings。 - Pradhan
1个回答

3
感谢Pradhan提供此链接,我理解了这个问题。
该链接阐述如下:
GCC有能力警告用户使用未初始化变量的值。这种值是未定义的,从来没有用过。它甚至不作为一个随机值有用,因为很少是一个随机值。不幸的是,在一般情况下检测到未初始化变量的使用相当于解决停机问题。GCC尝试通过使用优化器收集的信息来检测某些实例,并在给定命令行选项-Wuninitialized时发出警告。当前实现存在许多认为存在的缺点。首先,它只在通过-O1、-O2或-O3启用优化时起作用。其次,假阳性或假阴性的集合会根据启用的优化方式而变化。这也导致在版本之间添加或修改优化时所报告的警告高度可变。
事实上,当我添加其中一个标志时,编译器会出现警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接