【发布时间】:2017-10-24 16:47:29
【问题描述】:
我有以下 C++ 代码:
#include <memory>
#include <vector>
#include <string>
#include <unordered_map>
void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) {
for (auto mvec_it = mvec.begin(); mvec_it != mvec.end(); )
mvec_it = mvec.erase(mvec_it);
}
int main(void) {
#if 0
std::vector<std::weak_ptr<int>> mvec;
for (auto mvec_it = mvec.begin(); mvec_it != mvec.end(); )
mvec_it = mvec.erase(mvec_it);
#endif
}
当我以这种方式编译时,GCC 会产生警告:
ppk@fif-cloud-dev:~$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
ppk@fif-cloud-dev:~$ g++ -fstrict-overflow -Wstrict-overflow=5 -O2 -std=c++14 warn1.cc
warn1.cc: In function ‘void erase_from_vector(std::vector<std::weak_ptr<int> >&)’:
warn1.cc:6:6: warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Wstrict-overflow]
void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) {
^
但是当我将 -O2 标志更改为 -O1 时,它编译时没有任何警告。当我在 main() 中保留标志 -O2 和取消注释代码时,它也会在没有任何警告的情况下编译。 Clang 编译器也不报告任何警告。
我想这个警告来自 std::weak_ptr 析构函数,其中计数器递减但不知道为什么它出现在我的代码中。
这个警告是我的错误还是编译器出错引起的?
【问题讨论】:
-
为什么很多人将警告误解为错误?警告不是告诉你有任何错误,它只是告诉你它假设代码是正确的,这几乎不可能是错误的。好吧,这是一个相当无用的警告,它可能会在未来的版本中被删除,大多数(全部?)Wstrict-overflow...
-
因为导致一些警告可能很严重并且难以调试运行时错误。有时,花更多时间分析警告比在将来更正此类错误上花费更多时间更好。尤其是当您创建具有关键可靠性/安全性要求的软件时。
标签: c++ c++11 gcc gcc-warning