Visual Studio 2010의 컴파일러 오류입니까?
-
28-10-2019 - |
문제
이 조건부 버그가 있습니다. 라코 디스
릴리스 모드에서 무한 루프에 빠진 것 같습니다. 디버그 모드에서 잘 작동하거나 마지막 줄에 디버그 인쇄를 할 때 더 흥미롭게 작동합니다. 라코 디스
다음은 조건부 자체에 대해 생성 된 어셈블리입니다. 라코 디스
두 번째 조건에서는 bool 유형의 함수 매개 변수 인 'dontRotate'의 값을 eax로 이동 한 다음 비교하는 것처럼 보이지만 dontRotate는 해당 코드 근처에서 아무데도 사용되지 않습니다.
이것은 약간의 데이터 일 수 있지만 개인적으로는 명백한 컴파일러 오류 인 것 같습니다. 그러나 슬프게도 실제로 버그 보고서를 생성하기에 충분한 자체 포함 문제로이를 추출하는 방법을 모르겠습니다.
편집 : 실제 감속이 아니라 유형 : 라코 디스
편집 2 :
내가 debug print 문을 마지막에 추가하면 생성되는 어셈블리가 더 이상 버그를 표현하지 않습니다. 라코 디스
해결책
여기 :
while(/* foo */ && CurrentObserverPathPointIndex < (PathSize - 1) )
{
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
.
이것은 유일한 지점이기 때문에 min
가 변경되고 CurrentObserverPathPointIndex
및 CurrentObserverPathPointIndex
가 동일한 크기의 정수가 서명 된 상태 (및 PathSize
가 정수 프로모션 문제를 배제하기에 충분히 작습니다).나머지 부동 소수점 Fiddling은 무의미합니다.루프는 결국 종료되어야합니다.
이것은 하나의 결론 만 허용합니다.컴파일러가 종료되지 않는 코드를 생성하는 경우 컴파일러가 잘못되었습니다.
다른 팁
PathSize
가 루프에서 변경되지 않는 것처럼 보이므로 컴파일러는 looping 전에 PathSize - 1
를 계산하고 우연히 dontRotate
와 동일한 메모리 위치를 사용할 수 있습니다.
더 중요한 것은 CurrentObserverPath->pathPoints
에 몇 개의 요소가 있는가?
루프 조건에 다음 테스트가 포함됩니다. 라코 디스
루프 내부에는 다음과 같은 과제가 있습니다. 라코 디스
다음에 추가로 증가하는 아래 첨자 : 라코 디스
무작위 정의되지 않은 동작이 작동하는 것처럼 보이기 때문에 코드가 디버그 모드에서 작동하는 것처럼 보였을 수 있습니까?