In de programmeertaal C worden variabelen op verschillende manieren geïnitialiseerd, afhankelijk van de opslag-specificatie:
Voorbeeld van verschillen:
void example() { int a; // automatisch, niet geïnitialiseerd static int b; // geïnitialiseerd als 0 printf("a=%d, b=%d ", a, b); } int c; // globaal, geïnitialiseerd als 0
Fouten ontstaan uit een verkeerd begrip van de initiële waarde. Voor de veiligheid moet je altijd variabelen expliciet initialiseren.
Wordt een automatische lokale variabele geïnitialiseerd met de waarde 0, als deze buiten een blok op functieniveau is gedeclareerd?
Antwoord:
Nee! Zelfs als de variabele aan het begin van de functie is gedeclareerd, maar zonder expliciete initialisatie, bevat deze rommel:
void f() { int x; printf("%d ", x); // UB: x is niet geïnitialiseerd }
Verhaal
In banksoftware leidde het niet-initialiseren van een volgende teller binnen een functie ertoe dat deze soms een enorm negatief getal was — resultaat: er werden foutieve bonussen aan de klant toegekend, de bug werd pas ontdekt op echte data.
Verhaal
Een multimedia-afbeeldingsverwerker ging ervan uit dat statische arrays altijd met nullen waren gevuld. Na over te schakelen op een andere compiler (met een niet-standaard omgeving) werd een segfault ontdekt — een deel van het geheugen was niet fysiek aan het proces toegewezen.
Verhaal
In een cryptografische bibliotheek initialiseerde de ontwikkelaar een tijdelijke buffer voor wachtwoorden niet, denkende dat de buffer uit de global-sectie met nullen was gevuld, maar er deed zich een probleem voor met geheugen waar oude gevoelige gegevens waren achtergebleven. Dit leidde tot een lek van wachtwoorden bij een dump.