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 :

Une division par 0 qui donne 0 !


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut Une division par 0 qui donne 0 !
    Bonjour,
    je compile+exécute ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main ()
        {
        int x = (1/0) - 1  ;
        return x ;
        }
    sous Visual Studio 2017 en Win64, et la valeur affectée à x est -1 !
    je n'ai pas essayé en 32 bits, ni avec d'autres version de Visual, mais tout de même, ça laisse songeur...
    Pour info, avec x = (1/0) ; j'ai bien une erreur div by 0 à la compilation.

    Suis-je le seul dans ce cas ?
    Merci de vos avis/remarques...

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 223
    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 223
    Par défaut
    Capitaine Flam, tu es d'une autre galaxie ....

    Compilé en l'état sous gcc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test.c: In function ‘main’:
    test.c:3:15: warning: division by zero [-Wdiv-by-zero]
    et à l’exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ./a.out 
    Exception en point flottant
    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

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    VS 2017 semble supprimer l'opération.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mov         dword ptr [x],0FFFFFFFFh
    C'est abusif je trouve, mais écrire ce code est de toutes façons faux et ne devrait jamais être fait donc bon.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 223
    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 223
    Par défaut
    Il ne fait pas de warning VC 2017 ?
    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

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Non aucun, même avec /Wall.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Le compilateur est libre de faire ce qu'il veut lorsque le code est invalide.

    clang ne met pas de valeur de retour et gcc utilise une exception d'opcode invalide (en -O3) ou une exception sur les flottants est lancé par le matériel. https://godbolt.org/z/3kFe0m

    Par contre, mettre simplement int x = 1/0; ne compile pas avec msvc: error C2124: divide or mod by zero.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Si c'est un undefined behavior, tout peut arriver...

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Captain'Flam Voir le message
    sous Visual Studio 2017 en Win64, et la valeur affectée à x est -1 !

    Suis-je le seul dans ce cas ?
    Merci de vos avis/remarques...
    Bonjour

    Moi aussi, j'ai compilé avec gcc et j'ai comme chrtophe.

    J'ai toutefois une petite question idiote (ne connaissant pas le monde Microsoft/VS). T'es sûr que la sortie est "-1" ? Si par exemple je fais une analogie avec le monde Unix/Linux, la sortie d'un programme donne une valeur comprise entre 0 et 255 (donc modulée si le programme retourne une valeur dépassant ces limites). Il est donc tout à fait possible qu'il y ait modfication entre ce que sort ton code et la façon dont Windows le récupère non ? Moi si j'avais fait cette expérimentation, je l'aurais plutôt affichée dans mon code via un printf("%d\n", x) plutôt que d'envoyer cette valeur à l'OS. Et de fait, c'est ce que j'ai fait en réalité.

    Sinon en allant dans l'absolu, t'as tenté de remplacer ton "-1" par un "+1" ? Parce que bon, faire une opération illégale déjà c'est chaud pour déterminer ce qui se passe mais si en plus tu lui rajoutes des contraintes liées à la soustraction (extension du bit de signe, etc) ça complexifie encore plus ta recherche non ?

    Citation Envoyé par chrtophe Voir le message
    Capitaine Flam, tu es d'une autre galaxie ....
    C'est pas tout à fait exact. La chanson ne dit pas qu'il est d'une autre galaxie, mais dit en réalité qu'il n'est pas de la notre. Un peu comme si je concluais que Dumbo est un chat parce que quelqu'un me dit qu'il n'est pas un chien (Sophisme donc).
    Et elle rajoute "mais du fond de la nuit". Donc il est en réalité du fond de la nuit...

    Citation Envoyé par Bktero Voir le message
    Si c'est un undefined behavior, tout peut arriver...
    Tu es notre Salomon
    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]

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 223
    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 223
    Par défaut
    Le compilateur est libre de faire ce qu'il veut lorsque le code est invalide.
    Ah bon ? Pour moi il ne devrait pas compiler ce code invalide. Pour moi écrire x=(1/0) -1 revient à soustraire 2 constantes dont une est non évaluable, donc invalide. Déjà juste un warning avec gcc c'est gentil je trouve.
    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

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il y a plusieurs niveaux de code invalide, avec des différences très subtiles entre elles... Plus de détail là : https://en.cppreference.com/w/cpp/language/ub

    En gros, dans ce cas, il serait simple de diagnostiquer la division par 0. Mais dans le cas général, ce n'est pas possible. Et donc la norme ne va pas imposer à un compilateur de le faire. Après, ce que fait réellement un compilo ou un autre, c'est comme il en a envie (on parle généralement de QoI, quality of implementation).Et là, on peut dire qu'on aimerait probablement avoir mieux... Mais comme d'un autre côté, c'est artificiel comme exemple, veut-on vraiment que les devs du compilateur passent leur temps là dessus ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Merci à tous pour vos commentaire avisés.
    Pour information je ne viens pas de la galaxie ou on calcule des divisions par zéro pour le plaisir d'écrire du code loufoque

    Parmi mes outils perso de C/C++, j'ai une macro (COMPIL_ASSERT) qui dépend d'une condition.
    Si la condition est vérifié, l'évaluation de la macro donne 0.
    Sinon, elle tombe sur une division par zéro.

    Si le compilateur lève une erreur en cas de division par zéro (ce que je croyais certain) cette macro permet de tester certaines conditions à la compilation.
    Par exemple, dans un projet multi plateforme (qui doit fonctionner même avec des compilateurs antédiluviens),
    il peut être très utile d'ajouter COMPIL_ASSERT( sizeof( void* ) == sizeof( long )) quelque part dans le code.

    Mais depuis que j'ai installé Visual 2017, ces vérifications de vérifient plus rien...
    Et j'ai simplifié cette macro au maximum pour vous soumettre un code aussi simple que possible.

    Depuis, j'ai trouvé une autre astuce : ma macro déclare un tableau de dimension -1 si la condition n'est pas vérifiée.
    Mais je n'ai pas encore testé tous les compilateurs avec lesquels je suis amené à travailler.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Déclarer un tableau de taille -1 est l'implémentation que j'ai toujours vu pour ceci.
    Maintenant C++11 a ajouté ça dans le standard static_assert.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Ahhh static_assert, comme c'est beau, sobre et élégant...
    Malheureusement, non seulement mon projet n'est pas en C++, mais en plus il doit rester compatible C89 !
    Je l'ai posté sur le forum C++ parce que le framework de test (qui n'est pas livré aux clients) est en C++ (et que c'est en travaillant dessus que j'ai constaté ce pb).

    Pour en rajouter une couche, j'ajouterais que l'absence d'un simple warning me parait hautement dangereuse...
    Dans le cadre de post, ma macro ne sert qu'à faire un simili static_assert, mais on peut en imaginer une autre qui fasse un calcul réellement utilisé dans le code.
    Dans ce cas, si une constante change quelque part et conduit ce calcul de macro à une division par zéro, on aimerait en être informé...

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Sur un forum C++ on te fournit des réponses C++.
    Si maintenant ton projet n'est pas en C++, alors le problème initial change..

    Mais static_assert n'a pas attendu C++11 pour exister.
    Et bien entendu il existe des implémentations en C.
    http://www.drdobbs.com/compile-time-...ions/184401873

    Et ceci est l'implémentation que j'ai généralement vu un peu partout dans des codebases évolués du C #define assert_static(e) { char assert_static__[(e) ? 1 : -1] }

    https://stackoverflow.com/a/3385694
    Avec des variantes utilisant typedef et incluant un message #define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1] mais qui ne marchent pas dans des déclarations (donc intérêt limité imo).
    Donc la solution typedef est moins bonne imo, mais l'ajout du message peut être combiné à l'autre solution.


    Maintenant, mieux vaut utiliser celles fournies par le standard.
    Il semble qu'elles existent aussi dans C11 et ne sont donc pas limitées au C++11.
    Si un jour tu peux faire évoluer le truc, ou sur un autre projet.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 223
    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 223
    Par défaut
    Pour information je ne viens pas de la galaxie ou on calcule des divisions par zéro pour le plaisir d'écrire du code loufoque
    Pour moi c'était une boutade lié à ton pseudo et que je trouvait le résultat de VC surréaliste. Je n'ai pas les compétences C pour savoir si VC respecte les normes en faisant ce qu'il te fait.

    Mon test a été fait avec gcc 4.7.2. Je ne sais pas quelle norme il utilise (C89, C99, etc.)
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. plantage avec une division par 0
    Par wauant dans le forum Windows Vista
    Réponses: 2
    Dernier message: 04/07/2006, 08h04
  2. Mise à jour d'une balise par innerHTML qui pose pb !!
    Par nerik38 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2006, 16h13
  3. Afficher une fenêtre d'informations qui donne l'impression de se détâcher
    Par jean_bobi dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 25/09/2005, 15h31
  4. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 17h33
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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