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

발생하는 문제 및 실행환경

코드가 이상해요. 비주얼 스튜디오 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답변

  • 좋아요

    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   :        }
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.