Le code suivant génère différents résultats en mode débogage et en mode version (à l'aide de Visual Studio 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;
}
La sortie du mode débogage, qui est comme prévu:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
La sortie du mode de libération, où le résultat i: 15 n'est pas correct:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
En choisissant «Optimisation -> Ne pas optimiser» dans Visual Studio en mode version, le résultat de sortie sera correct. Cependant, j'aimerais savoir pourquoi le processus d'optimisation peut conduire à une sortie erronée.
Mettre à jour:
Comme suggéré par Mohit JainBy, imprime par:
printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;
La sortie du mode de déclenchement est correcte:
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
la source
la source
i * 16
dans le message, et le résultat est correct.Réponses:
C'est intéressant, du moins d'un point de vue historique. Je peux reproduire le problème avec VC 2008 (15.00.30729.01) et VC 2010 (16.00.40219.01) (ciblant soit 32 bits x86 ou 64 bits x64). Le problème ne se produit avec aucun des compilateurs que j'ai essayés à partir de VC 2012 (17.00.61030).
La commande que j'ai utilisée pour compiler:
cl /Ox vc15-bug.cpp /FAsc
Étant donné que VC 2008 (et 2010) est plutôt ancien et que le correctif existe depuis plusieurs années maintenant, je ne pense pas que vous puissiez vous attendre à une action de Microsoft sauf à utiliser un compilateur plus récent (bien que quelqu'un puisse peut-être suggérer une solution de contournement).
Le problème est que le test pour déterminer si la valeur doit être forcée
255
est effectué en fonction du nombre de boucles plutôt que du résultat réel de l'i * 16
expression. Et le compilateur obtient simplement le nombre erroné du moment où il doit commencer à forcer la valeur à255
. Je n'ai aucune idée de pourquoi cela se produit - c'est juste l'effet que je vois:Mise à jour : Toutes les versions de VC que j'ai installées avant VC 2008 ont le même bogue, sauf VC6 - la compilation du programme plante le compilateur VC6:
C'est donc un bug qui a duré dans MSVC sous une forme ou une autre pendant plus de 10 ans!
la source
result > 255
à,result >= 255
elle se comporte correctement. Dans VS2010, cela changecmp esi, 14
encmp esi, 16
(etjle
enjl
).En supposant que vos faits rapportés sont corrects, ce serait un bogue du compilateur. Vérifiez la dernière version du compilateur. Si le bogue est toujours présent, soumettez un rapport de bogue.
la source