Basis van programmeren in C
Welke beschrijving van ongedefinieerd gedrag in de zin van de C-standaard is juist?
- AGedrag waaraan de standaard geen eisen stelt; de compiler mag optimaliseren in de veronderstelling dat het nooit optreedt, zodat de resultaten onverwacht kunnen zijn
- BGedrag waarvan elke implementatie het resultaat bepaalt en dat ze verplicht moet documenteren
- 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.