IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Bug d'overflow d�routant ! [en partie r�solu]


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    �tudiant
    Inscrit en
    Avril 2008
    Messages
    13
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Par d�faut 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 : 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;
    }
    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.
    Petit chipotage pour obtenir ceci:

    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;
    }
    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 : 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:

    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;
    }
    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 : 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;
    }
    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;
    }
    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 ), 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...


  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Aucun probl�me chez moi (GCC 4.2.3), que ce soit avec les optimisations les plus agressives ou non.

  3. #3
    Expert confirm�

    Inscrit en
    Ao�t 2006
    Messages
    3 967
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2006
    Messages : 3 967
    Par d�faut
    Hie,

    Idem, pas de probl�me.

    Et je ne vois pas ce qui pourrait en poser ?

Discussions similaires

  1. R�ponses: 1
    Dernier message: 19/10/2010, 09h01
  2. [En partie R�solu] Soap et Tomcat
    Par chtorrel dans le forum Apache
    R�ponses: 1
    Dernier message: 08/03/2010, 16h51
  3. Bug avec overflow: hidden; sous IE
    Par IamKazuya dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 2
    Dernier message: 18/05/2007, 16h30
  4. bug ouverture d'un etat : message OVERFLOW
    Par aurel64 dans le forum IHM
    R�ponses: 4
    Dernier message: 29/09/2006, 11h55
  5. Bug GetDlgItemText r�solu � lire ...
    Par sziklai dans le forum API, COM et SDKs
    R�ponses: 2
    Dernier message: 27/07/2004, 13h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo