Undefined Behavior (UB) ist das Verhalten eines Programms, dessen Ergebnis durch den C-Standard nicht definiert ist. Der Compiler oder das System können beliebige Aktionen ausführen – von einem unauffälligen Fehler bis hin zu einem vollständigen Absturz oder einer Datenbeschädigung.
Typische Ursachen für UB:
Wie man UB minimieren kann:
int arr[5]; arr[10] = 0; // UB — außerhalb der Array-Grenzen int* p = NULL; *p = 42; // UB — Dereferenzierung eines NULL-Zeigers
Frage: Wie verhält sich das Programm, wenn eine Ganzzahl durch null geteilt wird?
Antwort: Laut C-Standard (ISO C99 6.5.5) ist die Division durch 0 undefined behavior. Ein Absturz, das Auftreten von Müll oder sogar ein "logisch korrektes" Ergebnis sind möglich, aber der Standard garantiert kein Ergebnis.
int a = 10, b = 0; printf("%d", a / b); // Undefined behavior
Geschichte
In einem der Projekte für eingebettete Systeme schrieb ein Programmierer eine Schleife über ein Array und ging versehentlich um ein Element über die Grenze. Die Anwendung lief normal, aber nach einem Monat begannen andere Daten im Speicher beschädigt zu werden (kurzfristige Fehler, schwer reproduzierbar). Das Problem wurde erst nach einer genauen Überprüfung und statischen Analyse gefunden.
Geschichte
Der Entwickler verließ sich darauf, dass die Dereferenzierung eines NULL-Zeigers immer einen Absturz verursacht, und fügte daher keine NULL-Überprüfungen hinzu. Auf einer seltenen Plattform führte dies jedoch zu einer inkorrekten (aber nicht fatalen) Modifikation des Speichers, die andere Strukturen beschädigte und zu schwer fassbaren Bugs führte.
Geschichte
Bei der Generierung von Pseudo-Zufallszahlen wurde eine Division verwendet, und bei bestimmten Werten der Eingangsparameter trat eine Division durch 0 auf. Auf den meisten Plattformen "stürzte" das Programm einfach ab, aber auf einer von ihnen war das Ergebnis eine inkorrekte Zahl, was zu Schwierigkeiten führte, Bugs zwischen verschiedenen Umgebungen zu reproduzieren.