문제

이 조건부 버그가 있습니다. 라코 디스

릴리스 모드에서 무한 루프에 빠진 것 같습니다. 디버그 모드에서 잘 작동하거나 마지막 줄에 디버그 인쇄를 할 때 더 흥미롭게 작동합니다. 라코 디스

다음은 조건부 자체에 대해 생성 된 어셈블리입니다. 라코 디스

두 번째 조건에서는 bool 유형의 함수 매개 변수 인 'dontRotate'의 값을 eax로 이동 한 다음 비교하는 것처럼 보이지만 dontRotate는 해당 코드 근처에서 아무데도 사용되지 않습니다.

이것은 약간의 데이터 일 수 있지만 개인적으로는 명백한 컴파일러 오류 인 것 같습니다. 그러나 슬프게도 실제로 버그 보고서를 생성하기에 충분한 자체 포함 문제로이를 추출하는 방법을 모르겠습니다.

편집 : 실제 감속이 아니라 유형 : 라코 디스

편집 2 :

내가 debug print 문을 마지막에 추가하면 생성되는 어셈블리가 더 이상 버그를 표현하지 않습니다. 라코 디스

도움이 되었습니까?

해결책

여기 :

while(/* foo */ && CurrentObserverPathPointIndex < (PathSize - 1) )
{
     CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
.

이것은 유일한 지점이기 때문에 min가 변경되고 CurrentObserverPathPointIndexCurrentObserverPathPointIndex가 동일한 크기의 정수가 서명 된 상태 (및 PathSize가 정수 프로모션 문제를 배제하기에 충분히 작습니다).나머지 부동 소수점 Fiddling은 무의미합니다.루프는 결국 종료되어야합니다.

이것은 하나의 결론 만 허용합니다.컴파일러가 종료되지 않는 코드를 생성하는 경우 컴파일러가 잘못되었습니다.

다른 팁

PathSize가 루프에서 변경되지 않는 것처럼 보이므로 컴파일러는 looping 전에 PathSize - 1를 계산하고 우연히 dontRotate와 동일한 메모리 위치를 사용할 수 있습니다.

더 중요한 것은 CurrentObserverPath->pathPoints에 몇 개의 요소가 있는가?

루프 조건에 다음 테스트가 포함됩니다. 라코 디스

루프 내부에는 다음과 같은 과제가 있습니다. 라코 디스

다음에 추가로 증가하는 아래 첨자 : 라코 디스

무작위 정의되지 않은 동작이 작동하는 것처럼 보이기 때문에 코드가 디버그 모드에서 작동하는 것처럼 보였을 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top