Maison >développement back-end >C++ >Pourquoi ce code C produit-il une boucle infinie sur GCC avec les optimisations activées ?

Pourquoi ce code C produit-il une boucle infinie sur GCC avec les optimisations activées ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-05 04:47:13787parcourir

Why Does This C   Code Produce an Infinite Loop on GCC with Optimizations Enabled?

Débordement d'entier sur x86 : démasquer l'énigme de la boucle infinie

Considérez l'extrait de code suivant qui plonge mystérieusement dans une boucle infinie lorsqu'il est compilé à l'aide de GCC :

int i = 0x10000000;
do {
    i += i;
    cout << i << endl;
} while (i > 0);

Le Mystère Démêlé

Bien que le débordement d'entier soit généralement un comportement indéfini, les instructions arithmétiques d'entiers de l'architecture x86 s'enroulent normalement si un débordement se produit. Cependant, dans ce cas, les optimisations de GCC introduisent une anomalie.

Les mésaventures de l'optimisation

Avec les optimisations activées, GCC suppose que le dépassement d'entier est impossible et élimine la vérification des conditions de sortie de boucle. En conséquence, lorsque l'entier i atteint une valeur négative, la boucle continue interminablement.

Gestion correcte de Visual Studio

Visual Studio, en revanche, gère correctement le dépassement d'entier et quitte la boucle comme prévu.

Détermination non définie Comportement

Ce comportement bizarre met en évidence la nature imprévisible d'un comportement indéfini. Même si le bouclage d'entiers est attendu sur x86, un comportement non défini peut se manifester de manière inattendue, frustrant les prédictions du compilateur.

Solutions de contournement

  • Désactiver les optimisations (-O0) pour appliquer des contrôles de débordement explicites.
  • Utilisez l'indicateur -fwrapv pour activer des contrôles de débordement bien définis. sémantique de débordement. Cependant, soyez conscient des pénalités de performances potentielles.

Conclusion

Le choix de GCC d'optimiser la condition de sortie de boucle en présence d'un comportement indéfini conduit à la perplexité boucle infinie. Cela rappelle les conséquences imprévisibles de la violation de règles de comportement non définies, exigeant la prudence lorsque l'on travaille avec l'arithmétique entière sur les plates-formes x86.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn