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:
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.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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; }
Petit chipotage pour obtenir ceci:
Ce programme l� s'arr�te bien pour me demander la valeur de a.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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; }
Cependant celui-ci ne le fait plus et cycle sans entrer dans le if:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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:
Et cette fois le programme s'arr�te ! Ce qui ne devrait pas arriver si le bug se poursuivait.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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; }
D'autre part, les codes suivants, avec les bornes modifi�es, fonctionnent parfaitement:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 : S�lectionner tout - Visualiser dans une fen�tre � part
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; }Il semblerait donc que parcourir plus de 31 bits de valeurs pour une boucle pose des probl�mes...
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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; }
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), 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.
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...
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...
![]()
Partager