와 이상한 경고를 생성 내가 변경할 때내 g ++는 내가 C++ 코드 다음 한 벡터 <weak_ptr> 삭제() 메소드
[email protected]:~$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
[email protected]:~$ 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로 설정하면 경고없이 컴파일됩니다. 플래그 -O2를 유지하고 main()에 주석 처리를 제거하면 경고없이 컴파일됩니다. Clang 컴파일러는 경고를보고하지 않습니다.
이 경고는 std :: weak_ptr 소멸자에서 발생한다고 가정합니다. 카운터가 감소하지만 코드에 왜 나타나는지는 알 수 없습니다.
내 오류 또는 컴파일러의 오류로 인한 경고입니까?
왜 많은 사람들이 경고를 오류로 오해합니까? 경고는 오류가 있다는 것을 알려주지 않고 코드가 정확하다고 가정하고 있다고 말하면서 오류는 거의 없습니다. 좋습니다, 그것은 오히려 쓸데없는 경고입니다. Wstrict-overflow가 대부분입니다. (모두?) –
경고의 일부가 심각하고 런타임 오류를 디버그하기 힘들 수 있기 때문에. 때로는 오류를 수정하는 데 더 많은 시간보다 경고를 분석하는 데 더 많은 시간을 보내는 것이 더 나을 때가 있습니다. 특히 중요한 안정성/보안 요구 사항이있는 소프트웨어를 만들 때. – ppk