In der Programmiersprache C werden Variablen abhängig vom Speicherqualifizierer unterschiedlich 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.
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 }
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.