如何让 g++ 为 int i = i 生成 error/warning?

how to make g++ generate an error/warning for int i = i?

我很难在我的代码中找到由这样的循环引起的错误:

for (int i=i;i<5;i++){
    // ...
}

我将 g++ 4.7.2 与 -O2 -Wall 一起使用,但未显示 warning/error。是否有一些编译器标志也与 -O2 结合为这种情况创建警告?

我发现了几个相关的问题: 在讨论的评论中,当没有 -O2 时,g++ 显示带有 -Wall 的警告。但是,这个问题很特殊,因为有问题的循环已通过 -O2 优化掉,这可以解释没有显示任何警告。在我的例子中,循环没有被优化掉,但我仍然没有得到警告。 同样相关的是 and this one. After reading those questions, I understand why c++ allows such non-sense (I like the example 因为它根本不是废话),但我仍在寻找一个编译器标志,它也会用 -O2.

创建警告

编译时clang编译器给我的

int main()
{
    int j = 0;
    for (int i=i; i<5; ++i)
        j++;
    return 0;
}

-O2 -Wall:

warning_loop.cxx:4:16: warning: variable 'i' is uninitialized 
when used within its own initialization [-Wuninitialized]
 for (int i=i; i<5; ++i)

gcc(5.3版)编译器也给出警告:

warning_loop.cxx: In function 'int main()':
warning_loop.cxx:4:16: warning: 'i' is used uninitialized in 
this function [-Wuninitialized]
 for (int i=i; i<5; ++i)

可以使用 valgrind 跟踪未初始化值的使用

valgrind --track-origins=yes ./a.out

给出输出:

==33052== Memcheck, a memory error detector
==33052== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==33052== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==33052== Command: ./a.out
==33052== 
==33052== Conditional jump or move depends on uninitialised value(s)
==33052==    at 0x100000F8C: ??? (in ./a.out)
==33052==    by 0x10022F5AC: start (in /usr/lib/system/libdyld.dylib)
==33052==  Uninitialised value was created by a stack allocation
==33052==    at 0x7FFF5FC01036: _dyld_start (in /usr/lib/dyld)