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 :

overflow sur int


Sujet :

C

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Responsable Syst�mes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Ao�t 2011
    Messages
    18 266
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Gestion de parcs informatique
    Secteur : High Tech - Mat�riel informatique

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 18 266
    Par d�faut overflow sur int
    Bonjour,

    Je voulais comment d�tecter un overflow sur une op�ration sur des int.

    Je ne code pas, c'est juste une interrogation.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 838
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par d�faut
    Bonjour
    D�sol� on ne peut pas. (unsigned short)65535 + 1 donnera 0 sans que tu ne puisses d�tecter si c'est normal ou pas. Enfin le terme "normal" est mal utilis� car c'est en r�alit� tout � fait normal (le "1" qui se trouve sur le 33� bit n'est pas r�cup�r�) mais tu ne peux pas d�tecter si la valeur officielle devait �tre 65536 ou 0.
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Responsable Syst�mes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Ao�t 2011
    Messages
    18 266
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Gestion de parcs informatique
    Secteur : High Tech - Mat�riel informatique

    Informations forums :
    Inscription : Ao�t 2011
    Messages : 18 266
    Par d�faut
    Merci pour le retour.

    C'�tait ce qu'il me semblait avoir compris, mais j�avais l'impression de comprendre de travers.

    Surprenant qu'on ne puisse d�tecter un overflow, je trouve m�me �a probl�matique.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 838
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par chrtophe Voir le message
    Surprenant qu'on ne puisse d�tecter un overflow, je trouve m�me �a probl�matique.
    C'est tir� de la conception du C: son but clairement d�fini est d'aller le plus vite possible. Et pour cela il ne v�rifie rien, absolument rien. Je peux �crire char *pt=(char*)123 puis aller voir printf("%d", *pt) je n'aurai aucun souci de compilation.
    C'est effectivement probl�matique pour ceux qui sont habitu�s � travailler avec un langage rempli de garde-corps.
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par d�faut
    Citation Envoy� par chrtophe Voir le message
    Surprenant qu'on ne puisse d�tecter un overflow, je trouve m�me �a probl�matique.
    bof, c'est surtout � l'ex�cution que le probl�me intervient.
    L'exemple de @Sve@r est assez simple, et n'est s�rement pas repr�sentatif des "overflows".
    Le compilateur peut faire la t�che mais pour combien de probl�mes ? 2% ? 20% ? 50% ? 70% ? 92% ?

    Et c'est l'histoire du vol 501 d'Ariane 5 (<- lien Wikip�dia) "les valeurs trop �lev�es mesur�es par les acc�l�rom�tres ont provoqu� un d�passement de capacit�"

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 838
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par foetus Voir le message
    L'exemple de @Sve@r est assez simple, et n'est s�rement pas repr�sentatif des "overflows".
    Le fait qu'un exemple soit simple est souvent une bonne chose, non ?
    C'est vrai, il se voulait plut�t repr�sentatif des erreurs d'adressage non d�tect�es et qui provoquent un UB. Parce que pour l'overflow effectivement, sauf � "voir" que la valeur finale est plus petite que la valeur d'origine (on pr�sume que celle-ci est cens�e cro�tre dans l'op�ration) il n'y a pas d'erreur � l'ex�cution (ni m�me de UB).

    Citation Envoy� par foetus Voir le message
    Et c'est l'histoire du vol 501 d'Ariane 5 (<- lien Wikip�dia) "les valeurs trop �lev�es mesur�es par les acc�l�rom�tres ont provoqu� un d�passement de capacit�"
    Un de mes profs d'info avait parl� de sinus n�gatif calcul� en unsigned (l�gende urbaine issue du t�l�phone arabe probablement) et le lien wiki est plus pr�cis. Ou alors il parlait d'un autre crash...
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Les languages C et C++ ne v�rifient pas les d�passements de capacit�s des types fondamentaux. D'autres languages vont pr�venir avec par exemple une exception. Mais est-ce vraiment mieux?
    Le code peut difficilement "corriger" le probl�me et aboutit finalement � un arr�t du programme.
    Si on prend le cas du vol 501 d'Ariane, il y aurait eu signalement imm�diat de l'anomalie (au lieu d'une anomalie d�tect�e indirectement) pour arriver finalement au m�me probl�me

    Justement, je connais le probl�me de l'Ariane. A l'�poque, ma soci�t� participait � la qualification de modules d'Ariane (pas celui incrimin� ici). Et pour pr�ciser ce que dit Wikip�dia, l'�volution du mat�riel a bien �t� requalifi�e. On a eu alors des pr�cisions en particulier sur le contr�le calibration indiqu� �videmment comme non actif pendant le vol. En fait les r�sultats n'�taient pas utilis�s, mais ses erreurs, elles, continuaient de remonter.
    Le principal probl�me est, selon moi, l'ambigu�t� sur "le contr�le calibration est d�sactiv�" (est-ce un retrait total, la non utilisation des r�sultats, les erreurs trait�es m�me si l'utilisation est d�sactiv�e?)

    Il y eu une cause additionnelle non cit�e dans l'article. La pr�paration a dur� plus que pr�vu, et la temp�rature du comburant �tait � la limite sup�rieure, d'o� une fluidit� plus grande, d'o� une pouss�e un peu sup�rieure � l'attendu. Peut-�tre que si on avait fait moins de pr�-contr�les, on n'aurait pas eu le probl�me

  8. #8
    Membre �prouv�
    Homme Profil pro
    Admin syst�mes (Windows, Linux) et r�seaux - Dev DB &Java IHM calcul scientifique
    Inscrit en
    Mai 2016
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Admin syst�mes (Windows, Linux) et r�seaux - Dev DB &Java IHM calcul scientifique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 90
    Par d�faut
    Citation Envoy� par Sve@r Voir le message
    Le fait qu'un exemple soit simple est souvent une bonne chose, non ?
    C'est vrai, il se voulait plut�t repr�sentatif des erreurs d'adressage non d�tect�es et qui provoquent un UB. Parce que pour l'overflow effectivement, sauf � "voir" que la valeur finale est plus petite que la valeur d'origine (on pr�sume que celle-ci est cens�e cro�tre dans l'op�ration) il n'y a pas d'erreur � l'ex�cution (ni m�me de UB).


    Un de mes profs d'info avait parl� de sinus n�gatif calcul� en unsigned (l�gende urbaine issue du t�l�phone arabe probablement) et le lien wiki est plus pr�cis. Ou alors il parlait d'un autre crash...
    Bonjour,
    Pareil, un prof citait l'exemple de bugs m�morables dont celui o� le r�sultat de calcul d'un sinus devenait brutalement n�gatif au passage de l'�quateur (la latitude changeant de signe), et le prof pr�cisait que l'avion en pilotage automatique se mettait � voler sur le dos...
    ... De m�me je n'ai jamais su si c'�tait av�r� ou une l�gende

  9. #9
    Membre �prouv�
    Homme Profil pro
    Admin syst�mes (Windows, Linux) et r�seaux - Dev DB &Java IHM calcul scientifique
    Inscrit en
    Mai 2016
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Admin syst�mes (Windows, Linux) et r�seaux - Dev DB &Java IHM calcul scientifique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2016
    Messages : 90
    Par d�faut
    Citation Envoy� par chrtophe Voir le message
    Bonjour,

    Je voulais comment d�tecter un overflow sur une op�ration sur des int.

    Je ne code pas, c'est juste une interrogation.
    Bonjour chrtophe,

    Je pense qu'il faudrait toujours d�tecter ce genre d'erreur la qualit� du logiciel ne peut qu'en �tre am�lior�e.

    Je compl�te mon commentaire avec un premier exemple qui traite le d�bordement d'entier en utilisant :
    l'option de compilation -ftrapv, et
    l'interception du signal SIGABRT

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    /** err1.c **/
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <signal.h>
    #include <stdint.h>
     
     
    void h1(int signal)
    {
    	printf("Interception signal SIGABRT (%d)\n", SIGABRT);
    	exit(1);
    }
     
    int main(){
     
    	int a = INT32_MAX ;
     
    	signal(SIGABRT,h1);
     
    	printf("Taille int = %d\n\t a= %d\n\t a+1 = ...",sizeof(int), a);
    	printf("%d\n", a+1);	
     
    	return(0);
    }
     
     
    /********* Compilation et exécution (Cygwin - gcc version 11.4.0)
    $ gcc -ftrapv  err1.c -o err1
    $ ./err1
    Taille int = 4
             a= 2147483647
             a+1 = ...Interception signal SIGABRT (6)
     
    Compilation sans l'option -ftrapv
    $ gcc  err1.c -o err1
    $ ./err1
    Taille int = 4
             a= 2147483647
             a+1 = ...-2147483648
     
    */
    Pour d'autres cas d'erreur, comme la division par z�ro, l'interception par signal() de SIGFPE peut aussi �tre utile ...
    Bien que la division par z�ro est de toute fa�on d�tect�e et provoque l'interruption du programme,
    le point o� elle se produit, peut �tre plus difficile (ou pas ;-) � localiser sans l'interception du signal.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    /** err2.c **/
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <signal.h>
    #include <stdint.h>
     
    void h2(int signal)
    {
    	printf("Interception signal SIGFPE (%d)\n", SIGFPE);
    	exit(2);
    }
     
    int main(){
     
    	int a = INT32_MAX ;
    	int b = 0 ;
     
    	signal(SIGFPE,h2);
     
    	printf("a / 0 = ...");			
    	printf("%d\n",a/b);
     
    	return(0) ;
    }
     
    /********* Compilation et exécution (Cygwin - gcc version 11.4.0)
    $ gcc err2.c -o err2
    $ ./err2
    a / 0 = ...Interception signal SIGFPE (8)
     
     
    $ gcc  err2.c -o err2
    $ ./err2
    Floating point exception
     
     
    */

Discussions similaires

  1. Probleme d'overflow sur le port s�rie
    Par jimay dans le forum MATLAB
    R�ponses: 2
    Dernier message: 29/03/2007, 11h23
  2. Probl�me vid�o et overflow sur Mac
    Par gregmab dans le forum Mise en page CSS
    R�ponses: 1
    Dernier message: 22/02/2007, 18h28
  3. Test sur int n�gatif: c'est comment?
    Par Jean_Benoit dans le forum C++
    R�ponses: 3
    Dernier message: 08/10/2006, 13h35
  4. [XHTML][CSS] Overflow sur DIV sans taille d�termin�e
    Par pingos dans le forum Mise en page CSS
    R�ponses: 3
    Dernier message: 20/08/2006, 15h37
  5. erreur ASM inline sur 'INT' avec delphi7
    Par the_magik_mushroom dans le forum Langage
    R�ponses: 1
    Dernier message: 03/11/2005, 01h41

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