Basis van programmeren in C

Welke beschrijving van ongedefinieerd gedrag in de zin van de C-standaard is juist?

  1. AGedrag waaraan de standaard geen eisen stelt; de compiler mag optimaliseren in de veronderstelling dat het nooit optreedt, zodat de resultaten onverwacht kunnen zijn
  2. BGedrag waarvan elke implementatie het resultaat bepaalt en dat ze verplicht moet documenteren
  3. CGedrag dat tijdens de uitvoering altijd wordt gedetecteerd, waarbij een foutmelding wordt afgedrukt en het programma stopt
Antwoord en toelichting tonen

Antwoord: A. Gedrag waaraan de standaard geen eisen stelt; de compiler mag optimaliseren in de veronderstelling dat het nooit optreedt, zodat de resultaten onverwacht kunnen zijn

Ongedefinieerd gedrag is gedrag waaraan de standaard geen enkele eis stelt, zoals overloop van integers met teken, toegang buiten de grenzen van een array, het derefereren van een NULL-pointer en gebruik na vrijgave. Het kan toevallig werken zoals verwacht, maar omdat de compiler mag optimaliseren in de veronderstelling dat het „in een correct programma niet voorkomt”, kan alleen al een andere optimalisatie-instelling of compilerversie het resultaat veranderen. Daartegenover heten zaken zoals de grootte van int en of char een teken heeft, die de implementatie bepaalt en moet documenteren, door de implementatie bepaald gedrag (implementation-defined behavior). Met -fsanitize=undefined detecteren gcc en clang een deel van het ongedefinieerde gedrag tijdens de uitvoering.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. int en unsigned int zijn 32 bits. Welke van de volgende bewerkingen is volgens de C-standaard ongedefinieerd gedrag?
  2. Als de bovenstaande functie met gcc met ingeschakelde optimalisatie wordt gecompileerd, kan de controle if (p == NULL) worden verwijderd. Wat is de reden?
  3. Wat legt de C-standaard vast over de grootte van het type int?
  4. In embedded programma's wordt een variabele die de waarde van een 32-bits randapparaatregister bevat, vaak gedeclareerd met uint32_t uit stdint.h in plaats van unsigned int. Wat is de belangrijkste reden?
  5. Wat is de uitvoer als de bovenstaande code, die een deling van gehele getallen bevat, wordt uitgevoerd?