2017-05-24 11 views
4

와 이상한 경고를 생성 내가 변경할 때내 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 소멸자에서 발생한다고 가정합니다. 카운터가 감소하지만 코드에 왜 나타나는지는 알 수 없습니다.

내 오류 또는 컴파일러의 오류로 인한 경고입니까?

+2

왜 많은 사람들이 경고를 오류로 오해합니까? 경고는 오류가 있다는 것을 알려주지 않고 코드가 정확하다고 가정하고 있다고 말하면서 오류는 거의 없습니다. 좋습니다, 그것은 오히려 쓸데없는 경고입니다. Wstrict-overflow가 대부분입니다. (모두?) –

+0

경고의 일부가 심각하고 런타임 오류를 디버그하기 힘들 수 있기 때문에. 때로는 오류를 수정하는 데 더 많은 시간보다 경고를 분석하는 데 더 많은 시간을 보내는 것이 더 나을 때가 있습니다. 특히 중요한 안정성/보안 요구 사항이있는 소프트웨어를 만들 때. – ppk

답변

3

대개 gcc 5.4의 버릇이 있습니다. gcc 6.1에 도착하자 마자 사라졌으며, 이후 버전에서도 다시 나타나지 않습니다.

gcc 5.4 (경고)

gcc 6.1 (경고없이)

그것은 연타가 동작을 재현하지 않습니다 특히 욕이다.

그런 행동이 doc ( 강조 광산)

서명 오버 플로우가 발생하지 않습니다 있다고 가정 최적화에 따라 정확히 버그가 아닙니다 주목해야한다

는 값의 경우 완벽하게 안전하다 관련된 변수 중 오버 플로우가 실제로 발생하지 않습니다. 따라서 이 경고는 쉽게 거짓 긍정을 줄 수 있습니다. : 실제로 문제가 아닌 코드에 대한 경고. 이 자체 면책와 함께 제공되는 가장 높은 경고 수준입니다 당신이 -Wstrict-overflow=5를 사용하는 것은, 그것은 훨씬 더 가능성이 만드는

:

이 경고 수준이 잘못된 반응의 매우 큰 수를 제공

내 제안은 컴파일러를 업그레이드하거나 gcc 5.4가 거짓 긍정을 제공한다는 것을 받아들이는 것입니다.

+2

또는 오 탐지 (false positive)가 발생하도록 문서화 된 경고를 활성화하지 마십시오. – Oktalist

+0

@Oktalist : 아주 좋은 지적입니다. 업데이트 된 게시물. – AndyG