Bug d'overflow d�routant ! [en partie r�solu]
Bonjour � tous !
Pr�cisions n�cessaires:
Config:
Mac Os X 10.5.2
Environnement de compilation:
Xcode Version 3.0
Component version
Xcode IDE 921.0
Xcode core 921.0
ToolSupport 893.0
C'est bien la premi�re fois que je suis confront� � ce bug ! Petite histoire:
Suite � un bug que je ne comprenais vraiment pas, j'ai simplifi� mon code de plus en plus tout en maintenant le bug:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#include <iostream>
using namespace std;
int main(int sys_nbr_args,char** sys_args)
{
int compteur = -1100000000;
while(compteur < 1100000000)
{
cout << compteur << endl;
compteur += 10000;
}
return 0;
} |
Ce code ne s'arr�te pas et l'affichage du compteur montre bien que le programme rentre dans la boucle au del� de la borne 1100000000... puis retombe dans les n�gatif et reprend sa mont�e... et ainsi de suite. :bug:
Petit chipotage pour obtenir ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
#include <iostream>
using namespace std;
bool bug(int truc)
{
return (truc > 1100000000);
}
int main(int sys_nbr_args,char** sys_args)
{
int compteur = -1100000000;
while(compteur < 1100000000)
{
cout << compteur << endl;
if(bug(compteur))
{
cout << " BUG ! " << endl;
int a;
cin >> a;
}
compteur += 10000;
}
return 0;
} |
Ce programme l� s'arr�te bien pour me demander la valeur de a.
Cependant celui-ci ne le fait plus et cycle sans entrer dans le if:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
#include <iostream>
using namespace std;
bool bug(int truc)
{
return (truc > 1100000000);
}
int main(int sys_nbr_args,char** sys_args)
{
int compteur = -1100000000;
while(compteur < 1100000000)
{
cout << compteur << endl;
if(bug(compteur))
{
cout << " BUG ! " << endl;
int a;
cin >> a;
break;
}
compteur += 10000;
}
return 0;
} |
Contre toute attente, je retire le cout:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#include <iostream>
using namespace std;
int main(int sys_nbr_args,char** sys_args)
{
int compteur = -1100000000;
while(compteur < 1100000000)
{
compteur += 10000;
}
return 0;
} |
Et cette fois le programme s'arr�te ! Ce qui ne devrait pas arriver si le bug se poursuivait.
D'autre part, les codes suivants, avec les bornes modifi�es, fonctionnent parfaitement:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#include <iostream>
using namespace std;
int main(int sys_nbr_args,char** sys_args)
{
int compteur = 0;
while(compteur < 1100000000)
{
cout << compteur << endl;
compteur += 10000;
}
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#include <iostream>
using namespace std;
int main(int sys_nbr_args,char** sys_args)
{
int compteur = -1100000000;
while(compteur < 0)
{
cout << compteur << endl;
compteur += 10000;
}
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
#include <iostream>
using namespace std;
int main(int sys_nbr_args,char** sys_args)
{
int compteur = -1000000000;
while(compteur < 1000000000)
{
cout << compteur << endl;
compteur += 10000;
}
return 0;
} |
Il semblerait donc que parcourir plus de 31 bits de valeurs pour une boucle pose des probl�mes...
Apr�s un d�sassemblage (c'est pas moi qui ai regard�, je ne connais pas l'asm), il semblerait que la valeur de la borne soit modifi�e.
Apr�s un gros chipotage (apparition du bug vers 11h00 tout de m�me :roll: ), j'ai choisi l'option "Project > Set Active Build Configuration > D�bug" qui, si j'ai bien compris, interdit l'optimisation du code lors de la compilation.
Avec cette option tout marche comme sur des roulettes. :yaisse2:
Il semblerait donc que ce soit le compilateur qui optimise comme une andouille, cr�ant des effets de bords sur des constantes et des entr�es de boucle... :evilred:
Cependant, c'est loin d'�tre une solution, car j'ai beau avoir du code qui marche, l'ex�cutable engendr� sera plus lourd et plus lent sans optimisation.
Quelqu'un a-t-il d�j� rencontr� ce probl�me ?
Avez-vous une solution � me proposer ?
Je ne sais pas o� ni s'il est possible de param�trer la latitude laiss�e au compilateur dans l'optimisation...
:help: