Die Spezifikation sagt: Ein Signed-Integer-Overflow ist undefiniert. Nicht falsch, nicht abgefangen, nicht auf einen bestimmten Wert festgelegt. Undefiniert. Das klingt nach einer Lücke im Standard. Tatsächlich ist es eine Lizenz, die der Compiler sich nimmt, um Code schneller zu machen, auf Kosten davon, dass er tut, was du erwartest.
Nimm eine Schleife, die bis zu einem int-Grenzwert hochzählt. Ein Entwickler, der aus einer Sprache mit definiertem Wraparound kommt, erwartet: bei Überlauf springt der Wert auf ein negatives Minimum. Der Compiler, der weiß, dass Overflow undefiniert ist, darf etwas anderes tun: er darf annehmen, dass die Schleife nie überläuft, weil das laut Spezifikation nicht passieren darf. Aus dieser Annahme heraus optimiert er die Abbruchbedingung komplett weg. Das Ergebnis ist keine falsche Zahl. Das Ergebnis ist eine Endlosschleife, die im Quellcode gar nicht so aussieht.
Der Trick ist die Prämisse, nicht der Fehler
Wer undefined behavior debuggt, sucht meistens am falschen Ort. Man sucht die Stelle, an der etwas falsch berechnet wird. Aber die Berechnung ist oft korrekt, gegeben die Prämisse, mit der der Compiler arbeitet: dass der Code, den du geschrieben hast, niemals undefiniertes Verhalten auslöst. Sobald diese Prämisse verletzt wird, ist alles danach im Programm formal beliebig, nicht nur die eine Zeile. Ein Nullpointer-Dereferenzierung drei Funktionen vorher kann einen Vergleich verändern, der textuell damit nichts zu tun hat.
Der Compiler lügt nicht. Er nimmt dich beim Wort, und dein Wort war ungenauer, als du dachtest.
Interne Notiz, Compiler-Team, 2026Warum das für mehr als C zählt
Die meisten Sprachen, die heute Finanzinfrastruktur schreiben, versprechen, dieses Problem eliminiert zu haben. Und im Kern stimmt das: Ein Typsystem, das Overflow explizit behandelt, verlagert die Entscheidung vom Compiler zurück zum Entwickler, wo sie sichtbar ist. Aber die gleiche Struktur taucht überall dort wieder auf, wo eine Spezifikation eine Bedingung offen lässt, in der Annahme, dass sie ohnehin nie eintritt. Ein Vertrag, ein Protokoll, ein Gesetzestext, der einen Fall nicht regelt, weil er unwahrscheinlich schien: Das ist strukturell dasselbe Problem, nur ohne Compiler, der es dir wenigstens optimiert um die Ohren haut, bevor es jemand in Produktion bemerkt.