디버그 모드랑 릴리즈 모드가 다른 결과가 나와요. 왜죠?


발생하는 문제 및 실행환경

코드가 이상해요. 비주얼 스튜디오 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"선택을 해야만 정확한 답이 나오는데 왜 이런 건가요

  • 2016년 01월 29일에 작성됨

조회수 212


1 답변


좋아요
0
싫어요
채택취소하기

오, 제가 해보니까 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   :        }
  • 2016년 01월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close