我很难在代码中找到由这样一个循环引起的bug:
for (int i=i;i<5;i++){
// ...
}
我在-O2 -Wall
**,中使用g++ 4.7.2,但是没有显示警告/错误。是否有一些编译器标志与** -O2
一起为这种情况创建了警告?
我发现了几个相关的问题:here在讨论的评论中,当没有-O2
时,g++会用-Wall
显示警告。但是,这个问题是特别的,因为问题循环是用-O2
优化的,这将解释没有显示警告。在我的例子中,循环没有被优化,但是我仍然没有得到警告。this question和this one也是相关的。在阅读了这些问题之后,我理解了为什么c++允许这样的非意义(我喜欢示例here,因为它根本不是胡说八道),但是我仍然在寻找一个编译器标志,它也会在-O2
中创建一个警告。
发布于 2016-04-08 03:05:21
当编译时,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)
未初始化值的使用可以用values跟踪。
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)
https://stackoverflow.com/questions/36497982
复制