ProgrammierungEmbedded C Entwickler

Wie werden Variablen unterschiedlicher Speicherarten (automatisch, statisch, global) in C initialisiert? Wie wirkt sich dies auf die Sicherheit und Korrektheit des Programms aus?

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

Antwort

In der Programmiersprache C werden Variablen abhängig vom Speicherqualifizierer unterschiedlich initialisiert:

  • Automatische (lokale) Variablen: besitzen einen uninitialisierten (Müll-)Wert, wenn nicht ausdrücklich ein Anfangswert zugewiesen wird. Ihr Inhalt stammt aus dem Speicher des Stacks, der zuvor verwendet wurde.
  • Statische lokale und globale Variablen (static, extern): werden immer mit Nullen (für Skalare – 0, für Zeiger – NULL) oder mit einem festgelegten Wert zur Linkzeit initialisiert.

Beispiel für Unterschiede:

void example() { int a; // automatisch, uninitialisiert static int b; // initialisiert als 0 printf("a=%d, b=%d ", a, b); } int c; // global, initialisiert als 0

Fehler entstehen aus falschen Annahmen über die Initialisierung. Zur Sicherheit sollten Variablen immer ausdrücklich initialisiert werden.

Fangfrage

Wird eine automatische lokale Variable mit dem Wert 0 initialisiert, wenn sie auf der Funktionsebene außerhalb eines Blocks deklariert wird?

Antwort:

Nein! Selbst wenn die Variable zu Beginn der Funktion deklariert wird, aber ohne ausdrückliche Initialisierung, enthält sie Müll:

void f() { int x; printf("%d ", x); // UB: x ist nicht initialisiert }

Beispiele für reale Fehler aufgrund fehlenden Wissens über die Feinheiten des Themas


Geschichte

In einer Bankanwendung führte eine versäumte Initialisierung des nächsten Zählers innerhalb einer Funktion dazu, dass dieser manchmal eine riesige negative Zahl war – Ergebnis: dem Kunden wurden falsche Boni gutgeschrieben, der Fehler wurde erst mit echten Daten entdeckt.


Geschichte

Der Multimedia-Bildverarbeiter ging zu Beginn davon aus, dass statische Arrays immer mit Nullen gefüllt sind. Nach dem Wechsel zu einem anderen Compiler (mit nicht-standardmäßigem Umfeld) trat ein Segfault auf – ein Teil des Speichers war physisch nicht dem Prozess zugewiesen worden.


Geschichte

In einer Kryptografiebibliothek initialisierte der Entwickler den temporären Passwortpuffer nicht und ging davon aus, dass der Puffer aus der globalen Sektion mit Nullen gefüllt ist, aber es kam zu einem Speicherfall, in dem alte sensible Daten verblieben. Dies führte zu einer Passwortleckage beim Dump.