如何让g ++为int i = i生成错误/警告?

时间:2016-04-08 11:01:14

标签: c++ compiler-warnings

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

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

我使用带有-O2 -Wall的g ++ 4.7.2,但没有显示警告/错误。是否有一些编译器标志也与-O2结合使用会为这种情况发出警告?

我发现了几个相关的问题: 在讨论的评论中here,当没有-Wall时,g ++会在-O2时显示警告。但是,这个问题很特别,因为有问题的循环使用-O2进行了优化,这可以解释没有显示警告。在我的情况下,循环没有被优化掉,但我仍然没有得到任何警告。 相关的还有this questionthis one。在阅读完这些问题之后,我理解为什么c ++允许这样的无意义(我喜欢这个例子here,因为它根本不是废话),但我仍在寻找一个编译器标志,它也会用{{{ 1}}。

1 个答案:

答案 0 :(得分:1)

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)