如何让 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)
我很难在我的代码中找到由这样的循环引起的错误:
for (int i=i;i<5;i++){
// ...
}
我将 g++ 4.7.2 与 -O2 -Wall
一起使用,但未显示 warning/error。是否有一些编译器标志也与 -O2
结合为这种情况创建警告?
我发现了几个相关的问题:
-O2
时,g++ 显示带有 -Wall
的警告。但是,这个问题很特殊,因为有问题的循环已通过 -O2
优化掉,这可以解释没有显示任何警告。在我的例子中,循环没有被优化掉,但我仍然没有得到警告。
同样相关的是 -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)