Der folgende Code generiert im Debug- und Release-Modus (mit Visual Studio 2008) unterschiedliche Ergebnisse:
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;
}
Die Ausgabe des Debug-Modus, die wie erwartet ist:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
Die Ausgabe des Freigabemodus, in dem das i: 15-Ergebnis nicht korrekt ist:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
Wenn Sie in Visual Studio im Release-Modus "Optimierung -> Nicht optimieren" wählen, ist das Ausgabeergebnis korrekt. Ich würde jedoch gerne wissen, warum der Optimierungsprozess zu fehlerhaften Ausgaben führen kann.
Aktualisieren:
Wie von Mohit JainBy vorgeschlagen, druckt von:
printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;
Die Ausgabe im Freigabemodus ist korrekt:
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
c++
c
optimization
visual-studio-2008
compiler-bug
Lorris Lin
quelle
quelle
i * 16
im Beitrag, und das Ergebnis ist korrekt.Antworten:
Dies ist zumindest aus historischer Sicht interessant. Ich kann das Problem mit VC 2008 (15.00.30729.01) und VC 2010 (16.00.40219.01) reproduzieren (entweder auf 32-Bit x86 oder 64-Bit x64). Das Problem tritt bei keinem der Compiler auf, die ich ab VC 2012 (17.00.61030) ausprobiert habe.
Der Befehl, den ich zum Kompilieren verwendet habe:
cl /Ox vc15-bug.cpp /FAsc
Da VC 2008 (und 2010) ziemlich alt ist und das Update bereits seit mehreren Jahren verfügbar ist, können Sie von Microsoft keine Aktion erwarten, außer die Verwendung eines neueren Compilers (obwohl möglicherweise jemand eine Problemumgehung vorschlagen kann).
Das Problem besteht darin, dass der Test zur Bestimmung, ob der Wert erzwungen werden
255
soll, eher auf der Anzahl der Schleifen als auf dem tatsächlichen Ergebnis desi * 16
Ausdrucks basiert . Und der Compiler erhält einfach die falsche Zählung, wenn er den Wert erzwingen soll255
. Ich habe keine Ahnung, warum das passiert - es ist nur der Effekt, den ich sehe:Update : Alle Versionen von VC, die ich vor VC 2008 installiert habe, haben denselben Fehler, außer VC6 - beim Kompilieren des Programms stürzt der VC6-Compiler ab:
Dies ist also ein Fehler, der in MSVC in der einen oder anderen Form mehr als 10 Jahre andauerte!
quelle
result > 255
,result >= 255
verhält er sich korrekt. In VS2010 ändert sich diescmp esi, 14
zucmp esi, 16
(undjle
zujl
).Vorausgesetzt, Ihre gemeldeten Fakten sind korrekt, wäre dies ein Compiler-Fehler. Überprüfen Sie die neueste Version des Compilers. Wenn der Fehler weiterhin vorhanden ist, senden Sie einen Fehlerbericht.
quelle