Zitat Zitat von _R2D2
Das schlimmste was der arme GNU macht ist immer noch while(var) zu while(true) zu verändern, wenn var nur in einem Interrupt verändert wird und nicht volatile ist.
Was aus Compilersicht meiner Meinung nach korrekt ist.
Beispiel:

"var" ist als nicht volatile deklariert

"var" wird innerhalb der main Routine nicht direkt, und auch nicht durch Funktionsaufrufe/call by Refrenze etc. geändert.

-> der Compiler kommt zu der Annahme, das "var" sich über die gesamte Laufzeit nicht ändern wird, also wird die Variable überall im Code duch eine Konstante ersetzt, durch 0, bzw. durch einen evtl. initialisierten Wert. Das es ein komplett abgetrenntes "Programm", nämlich eine Interruptroutine gibt, welches durch die Hardware aufgerufen wird, kann der Compiler ohne Hilfe nicht wissen.

Im übrigen ist mir kein einziger Fall bekannt, bei dem der GCC durch eine Optimierung zu falschem Maschinencode führt. Allerdings kann der Compiler eben nur über die Informationen verfügen, die man ihm auch mitteilt. Und ob eine Variable nun volatile ist oder nicht, muss man ihm schon sagen. Tut man das nicht, kommt es zu derart "veroptimierten" Schleifen. Macht man sich aber klar, was man da eigentlich gerade geschrieben hat, hat der Compiler keinen Fehler gemacht.