SORU
9 Temmuz 2015, PERŞEMBE


Serbest modunda, kod davranış değil beklendiği gibi

Aşağıdaki kod hata ayıklama modu ve serbest modu altında farklı sonuçlar üretir (Visual Studio 2008 kullanarak):

int _tmain(int argc, _TCHAR* argv[])
{

    for( int i = 0; i < 17; i   ) 
    { 
        int result = i * 16;

        if( result > 255 )
        {
            result = 255;
        }

        printf("i:-, result = =\n", i, result) ; 
    } 

    return 0;
}

Beklendiği gibi hata ayıklama modu çıkış:

i: 0, result =   0
i: 1, result =  16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255

Ben burada serbest modu çıkış:15 sonuç doğru değildir:

i: 0, result =   0
i: 1, result =  16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255

Seçme " - ^ Optimizasyonu . Optimize etmek için değil" doğru olacaktır Bu yayın modu, altında Visual Studio. Ancak optimizasyon işlemi hatalı çıktı neden olabilir neden bilmek istiyorum.


Güncelleme:

Mohit JainBy önerdiği gibi, izleri için:

printf("i:-, result = =, i*16=%d\n", i, result, i*16) ;

Yayın modu çıktı doğru

i: 0, result =   0, i*16=0
i: 1, result =  16, i*16=16
(...)
i:14, result = 224, i*16=224
i:15, result = 240, i*16=240
i:16, result = 255, i*16=256

CEVAP
9 Temmuz 2015, PERŞEMBE


Bu ilginç, en azından tarihsel bir bakış açısıyla. VC 2008 sorun (15.00.30729.01) çoğaltabilirveVC 2010 (16.00.40219.01) (32-bit x 86 veya 64-bit x 64 hedefleme). Sorun VC 2012 ile başlayan denedim Derleyiciler (17.00.61030) ile meydana gelmez.

Derlemek için kullanılan komut: cl /Ox vc15-bug.cpp /FAsc

2008 yılından bu yana VC (2010) oldukça eski ve tamir edilmiş olarak birkaç yıl için şimdi, sanmıyorum bekleyebilirsiniz herhangi bir işlem Microsoft dışında kullanmak daha yeni bir derleyici (ama belki birinin bir kenarı geçici).

Sorun olursa değeri 13 ** zorlanıp olmadığını belirlemek için test döngü sayacı yerine i * 16 ifadenin gerçek sonuca göre yapılır. Ve derleyici sadece yanlış sayısı 255 değeri zorlayarak başlaması zaman alır. Bu neden oluyor hiç bir fikrim yok - sadece gördüğüm etkisi:

; 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 )

  // the value `esi` is compared with in the following line should be 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   :        }

Güncelleme: 2008 VC daha önceki yüklü VC tüm sürümlerinde aynı hata, VC6 - program VC6 derleyici çöker derleme dışında:

vc15-bug.cpp(10) : fatal error C1001: INTERNAL COMPILER ERROR

Bu bir form veya 10 yıldan fazla bir MSVC süren bir hata değildir!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • Erica Griffin

    Erica Griffi

    8 HAZİRAN 2009
  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007