Ber*_*ach 5 c++ gcc initialization clang
#include <ios>
#include <iostream>
#include <map>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
map<int, int> v;
int i;
int t;
while (cin >> i) {
v[i] = t++;
}
auto mi = i;
auto mt = t;
for (const auto p : v) {
if (p.second < mt) {
mi = p.first;
mt = p.second;
}
}
cout << mi << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述程序大量使用未初始化的变量t
,但GCC不报告-Wall或-Wuninitialized.为什么会这样?
值得注意的是,Clang抓住了它:
main.cpp:13:12: warning: variable 't' is uninitialized when used here [-Wuninitialized]
v[i] = t++;
^
Run Code Online (Sandbox Code Playgroud)
使用的g ++(GCC)7.2.1 20170915(Red Hat 7.2.1-2).
使用过的clang版本4.0.1(标签/ RELEASE_401/final).
正如您在https://godbolt.org/g/kmYMC1中看到的那样,GCC 7.2即使应该也不会报告.我将在GCC的问题跟踪器中创建一张票.
不调用g ++的警告标志:调用-Wuninitialized
它-Wmaybe-uninitialized
.
此外,正如Jonathan Wakely在他的回答中所指出的,只有在启用优化时,g ++才能检测未初始化变量的使用情况.
启用这两个-Wmaybe-initalized
和优化会产生预期的警告:https://godbolt.org/g/3CZ6kT
请注意,-Wmaybe-initalized
默认情况下启用了-Wall
和-Wextra
.
GCC 只能在启用优化时检测未初始化的变量,因为跟踪变量值的逻辑是优化机制的一部分。
如果你编译,-O -Wall
你会得到一个警告:
<source>: In function 'int main()':
12 : <source>:12:13: warning: 't' may be used uninitialized in this function [-Wmaybe-uninitialized]
v[i] = t++;
~^~
Compiler exited with result code 0
Run Code Online (Sandbox Code Playgroud)