Heim >Backend-Entwicklung >C++ >Warum erzeugt dieser C-Code eine Endlosschleife auf GCC mit aktivierten Optimierungen?

Warum erzeugt dieser C-Code eine Endlosschleife auf GCC mit aktivierten Optimierungen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-05 04:47:13790Durchsuche

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

Ganzzahlüberlauf auf x86: Das Endlosschleifen-Rätsel aufdecken

Betrachten Sie den folgenden Codeausschnitt, der beim Kompilieren mit GCC auf mysteriöse Weise in eine Endlosschleife stürzt :

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

Das Geheimnis Unraveled

Während ein Integer-Überlauf typischerweise ein undefiniertes Verhalten ist, werden die Integer-Arithmetikanweisungen der x86-Architektur normalerweise umgebrochen, wenn ein Überlauf auftritt. In diesem Fall führen die Optimierungen von GCC jedoch zu einer Anomalie.

Missgeschicke der Optimierung

Bei aktivierten Optimierungen geht GCC davon aus, dass ein Ganzzahlüberlauf unmöglich ist, und eliminiert die Überprüfung der Schleifenausgangsbedingung. Wenn also die ganze Zahl i einen negativen Wert annimmt, wird die Schleife endlos fortgesetzt.

Korrekte Handhabung durch Visual Studio

Visual Studio hingegen Behandelt den Ganzzahlüberlauf korrekt und verlässt die Schleife wie vorgesehen.

Undefiniert ermitteln Verhalten

Dieses bizarre Verhalten unterstreicht die Unvorhersehbarkeit undefinierten Verhaltens. Auch wenn auf x86 ein ganzzahliger Wraparound erwartet wird, kann sich undefiniertes Verhalten auf unerwartete Weise manifestieren und die Vorhersagen des Compilers zunichte machen.

Problemumgehungen

  • Optimierungen deaktivieren (-O0) um explizite Überlaufprüfungen zu erzwingen.
  • Verwenden Sie das Flag -fwrapv, um wohldefinierte Funktionen zu aktivieren Überlaufsemantik. Seien Sie sich jedoch möglicher Leistungseinbußen bewusst.

Fazit

Die Entscheidung von GCC, die Schleifenausgangsbedingung bei Vorliegen undefinierten Verhaltens zu optimieren, führt zu Verwirrung Endlosschleife. Dies dient als Erinnerung an die unvorhersehbaren Folgen der Verletzung undefinierter Verhaltensregeln und erfordert Vorsicht beim Arbeiten mit Ganzzahlarithmetik auf x86-Plattformen.

Das obige ist der detaillierte Inhalt vonWarum erzeugt dieser C-Code eine Endlosschleife auf GCC mit aktivierten Optimierungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn