ProgrammatieEmbedded C ontwikkelaar

Hoe worden variabelen van verschillende opslagtypes (automatisch, statisch, globaal) in C geïnitialiseerd? Wat zijn de gevolgen voor de veiligheid en correctheid van het programma?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In de programmeertaal C worden variabelen op verschillende manieren geïnitialiseerd, afhankelijk van de opslag-specificatie:

  • Automatische (lokale) variabelen: hebben een niet-geïnitialiseerde (rommel) waarde, tenzij er expliciet een beginwaarde wordt gegeven. De inhoud is dat deel van het stack-geheugen dat er eerder was.
  • Statische lokale en globale variabelen (static, extern): worden altijd geïnitialiseerd met nullen (voor scalars — 0, voor pointers — NULL) of met een opgegeven waarde tijdens de linkfase.

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.

Vraag met een valstrik

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 }

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


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.