【问题标题】:how to make g++ generate an error/warning for int i = i?如何让 g++ 为 int i = i 生成错误/警告?
【发布时间】:2016-04-08 11:01:14
【问题描述】:

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

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

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

我发现了几个相关的问题: here 在讨论的 cmets 中,当没有 -O2 时,g++ 会显示带有 -Wall 的警告。但是,这个问题很特殊,因为有问题的循环已经用-O2 进行了优化,这可以解释没有显示警告。在我的情况下,循环没有被优化掉,但我仍然没有收到任何警告。 同样相关的是this questionthis one。在阅读了这些问题之后,我明白了为什么 c++ 允许这样的废话(我喜欢示例 here,因为它根本不是废话),但我仍在寻找一个编译器标志,它也会用-O2 创建一个警告。

【问题讨论】:

  • 赞成的问题,因为它让我意识到我的 gcc 也有同样的问题,我应该使用更新的问题。

标签: c++ compiler-warnings


【解决方案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)

【讨论】:

  • 你也试过-Wall -O2吗?
  • 是的,这没什么区别
  • valgrind 在你的情况下给出了什么?
  • 我不是在构建一个可执行文件,而是一个由某些框架动态加载的.so。当我尝试valgrind ./mylib.so 时,它只显示了一个错误,而这实际上不是我的代码的一部分:(
  • 好吧,仍然一样,但是,由于 g++ 的行为在最近的版本中有所不同,我怀疑 4.7.2 的标志可以满足我的要求,我猜你的答案是我能得到的最好的。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多