#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;
}
上述程序大量使用了未初始化的变量t
,但 GCC 不会使用 -Wall 或 -Wuninitialized 报告它。为什么会这样呢?
值得注意的是 Clang 捕获了它:
main.cpp:13:12: warning: variable 't' is uninitialized when used here [-Wuninitialized]
v[i] = t++;
^
使用 g++ (GCC) 7.2.1 20170915(红帽 7.2.1-2)。
使用 clang 版本 4.0.1 (tags/RELEASE_401/final)。
正如你所看到的https://godbolt.org/g/kmYMC1 https://godbolt.org/g/kmYMC1即使应该报告,GCC 7.2 也没有报告。我将在 GCC 的问题跟踪器中创建一个票证。
g++ 的警告标志未被调用-Wuninitialized
: 它被称为-Wmaybe-uninitialized
.
Also, 正如乔纳森·韦克利(Jonathan Wakely)在回答中指出的那样 https://stackoverflow.com/a/47308887/598696,仅当启用优化时,g++ 才能检测未初始化变量的使用。
启用两者-Wmaybe-initalized
优化会产生预期的警告:https://godbolt.org/g/3CZ6kT https://godbolt.org/g/3CZ6kT
注意-Wmaybe-initalized
默认情况下启用两者-Wall
and -Wextra
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)