Maison >développement back-end >C++ >Pourquoi ce code de dépassement d'entier entraîne-t-il une boucle infinie dans GCC sur x86 ?

Pourquoi ce code de dépassement d'entier entraîne-t-il une boucle infinie dans GCC sur x86 ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-04 07:14:18512parcourir

Why Does This Integer Overflow Code Result in an Infinite Loop in GCC on x86?

Comprendre le débordement d'entier dans GCC sur x86

Problème :

Le code fourni entre un boucle infinie sur GCC lors d'une tentative de débordement d'entier avec un x86 architecture :

int i = 0x10000000;
while (i > 0) {
    i += i;
}

Raison :

Le débordement d'entier dans GCC sur x86 est un comportement indéfini et le comportement observé peut varier. GCC implémente généralement l'arithmétique entière à l'aide d'instructions entières x86, qui s'enroulent généralement en cas de débordement. Cependant, dans ce cas, le compilateur suppose que le débordement n'est pas prévu et effectue des optimisations qui aboutissent à une boucle infinie.

Solution :

Pour garantir un comportement de bouclage , un contrôle explicite des débordements est nécessaire. Ceci peut être réalisé en :

  • Activation de la vérification de débordement : La transmission de l'indicateur -fwrapv à GCC applique une sémantique de débordement à compléments à deux, garantissant un bouclage prévisible. Cependant, cela peut avoir un impact sur les performances.

Implémentations alternatives :

  • Opération de décalage : Décalage vers la gauche de 1 (i <<= 1;) ne présente pas le comportement de boucle infinie, car il ne provoque pas débordement.

Explication du code :

Le code assembleur de la boucle problématique révèle que le compilateur optimise le test de boucle en partant de l'hypothèse que le débordement ne se produira pas se produire. Du coup, la boucle continue indéfiniment.

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