Nous observons un étrange cas où, dans VS2015 Update3 compilateur va omettre la partie du code pour aucune raison évidente.
Nous avons constaté que
- Ce qui se passe dans VS2015 Update3 (Aide|a Propos dit 14.0.25431.01 mise à Jour 3, cl.exe version 19.00.24215.1)
- Cela ne se produit pas dans VS2015 Update2 (Aide|a Propos dit 14.0.25123.00 mise à Jour 2, cl.exe version 19.00.23918)
- Cela se produit uniquement lorsque l'optimisation est activée (par exemple, dans la Version par défaut de la configuration)
- Qui se passe dans les versions x86 et x64
- Se produit lorsque l'extrait de code est inséré dans nouvelle marque "Win32 Console Application" (je veux dire, pas de fantaisie, options de ligne de commande requis)
Nous avons réussi à réduire le coupable code de cet extrait:
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
int _tmain(int, _TCHAR*[])
{
volatile int someVar = 1;
const int indexOffset = someVar ? 0 : 1; // Loop omitted
// const int indexOffset = !someVar; // Loop omitted
// const int indexOffset = 0; // Good
// const int indexOffset = 1; // Good
// const int indexOffset = someVar; // Good
// const int indexOffset = someVar + 1; // Good
for (int i = 1 - indexOffset; i < 2 - indexOffset; ++i)
{
printf("Test passed\n");
}
return 0;
}
Pour les lignes qui disent "Boucle omis", l'ensemble du corps de boucle est omis par le compilateur. Pourquoi? À ma connaissance, il n'existe pas de comportement indéfini impliqués.
Le démontage de la première Boucle "omis":
int _tmain(int, _TCHAR*[])
{
01151010 push ebp
01151011 mov ebp,esp
01151013 push ecx
volatile int someVar = 1;
01151014 mov dword ptr [ebp-4],1
const int indexOffset = someVar ? 0 : 1; // Loop omitted
0115101B mov eax,dword ptr [someVar]
// const int indexOffset = !someVar; // Loop omitted
// const int indexOffset = 0; // Good
// const int indexOffset = 1; // Good
// const int indexOffset = someVar; // Good
// const int indexOffset = someVar + 1; // Good
for (int i = 1 - indexOffset; i < 2 - indexOffset; ++i)
{
printf("Test passed\n");
}
system("pause");
0115101E push offset string "pause" (011520F8h)
01151023 call dword ptr [__imp__system (0115205Ch)]
01151029 add esp,4
return 0;
0115102C xor eax,eax
}
0115102E mov esp,ebp
01151030 pop ebp
01151031 ret
Projet de Test: http://dropmefiles.com/S7mwT
Essayer en ligne!
- Aller à http://webcompiler.cloudapp.net/
- Mettre un exemple de code de l'éditeur
- Mettre
/O2
deAdditional compiler flags
- Vérifiez
Run executable after compilation
Rapport de Bug: https://developercommunity.visualstudio.com/content/problem/71906/compiler-optimization-code-generation-bug.html