ProgrammierungC-Entwickler

Was ist 'undefined behavior' in der C-Sprache? Nennen Sie Beispiele für sein Auftreten und Möglichkeiten zur Minimierung solcher Probleme.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Zugriff außerhalb der Array-Grenzen
  • Dereferenzierung eines uninitialisierten/nicht gültigen Zeigers
  • Division durch 0
  • Modifikation von Konstanten

Wie man UB minimieren kann:

  • Variablen immer initialisieren
  • Array-Indizes überprüfen
  • Statische und dynamische Code-Analysatoren verwenden (z. B. valgrind, AddressSanitizer)

Beispielcode:

int arr[5]; arr[10] = 0; // UB — außerhalb der Array-Grenzen int* p = NULL; *p = 42; // UB — Dereferenzierung eines NULL-Zeigers

Fangfrage.

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.

Beispielcode:

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.