디버그 모드랑 릴리즈 모드가 다른 결과가 나와요. 왜죠?
조회수 3173회
발생하는 문제 및 실행환경
코드가 이상해요. 비주얼 스튜디오 2008에서 개발하고 있는데 디버그 할 때랑 릴리즈 할 때랑 왜 다른 결과가 나올까요
소스코드
int _tmain(int argc, _TCHAR* argv[])
{
for( int i = 0; i < 17; i++ )
{
int result = i * 16;
if( result > 255 )
{
result = 255;
}
printf("i:%2d, result = %3d\n", i, result) ;
}
return 0;
}
디버그 모드에서는 제 예상대로 잘 나오는데
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
근데 릴리즈 모드에서는 i:15일 때 이상하게 출력해요
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
릴리즈 모드에서 "Optimization -> Not to optimize"선택을 해야만 정확한 답이 나오는데 왜 이런 건가요
1 답변
-
오, 제가 해보니까 VC 2008, 2010에서는 디버그랑 릴리즈가 다르게 나오는데 VC2012에서는 똑같이 나오네요
컴파일할 때 쓴 명령은
cl /Ox vc15-bug.cpp /FAsc
입니다.각 상황에서 다른 결과가 나오는 이유는 for문이 조건을 확인할 때
i*16
의 값을 확인하는 게 아니라 count를 쓰고, 컴파일러가 count를 잘못했기 때문입니다. 근데 저도 컴파일러가 왜 count를 이상하게 했는지는 잘 모르겠네요.; 6 : for( int i = 0; i < 17; i++ ) 00001 33 f6 xor esi, esi $LL4@main: 00003 8b c6 mov eax, esi 00005 c1 e0 04 shl eax, 4 ; 7 : { ; 8 : int result = i * 16; ; 9 : ; 10 : if( result > 255 ) // 원래 esi,14가 14가 아니라 15여야 합니다 00008 83 fe 0e cmp esi, 14 ; 0000000eH 0000b 7e 05 jle SHORT $LN1@main ; 11 : { ; 12 : result = 255; 0000d b8 ff 00 00 00 mov eax, 255 ; 000000ffH $LN1@main: ; 13 : }
댓글 입력