unsigned int를 사용하여 signed int를 빼고 결과를 float로 캐스트하는 레거시 코드가 있습니다. Visual Studio 6에서 2013까지 예상 된 결과를 제공했습니다. Visual Studio 2017 (15.6.3)에서는 예상 한 결과가 아닙니다. 코드를 다음과 같이 단순화했습니다.
unsigned int uint = 10;
signed int sint = 9;
signed int res = sint - uint;
float fres = static_cast<float>(sint - uint);
res 값은 내가 테스트 한 모든 VS에서 -1입니다. VS 2013 및 이전 버전에서는 fres 값이 -1입니다. VS 2017에서 fres 값은 4.29496730e + 09, 즉 UINT_MAX입니다. 나는 여기서 VS 2017의 fres 결과가 C ++ 11 표준을 준수한다는 것을 발견 했습니다 (올바르게 이해한다면). VS 2017 컴파일러는 이에 대한 경고를 발행하지 않습니다.
내 코드베이스에서 이러한 잘못된 뺄셈의 모든 발생을 어떻게 감지 할 수 있습니까?
MSVC는이를 감지 할 수 /W4 /c
없거나 /Wall
추가 linter가 필요합니다. 예를 들어이를 clang-tidy
감지하는 것입니다 ( Stephen Newell 제공 ).
g++
컴파일러를 사용할 때 -Wsign-conversion
컴파일러 옵션을 찾고 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다