Wat is Ongedefinieerd gedrag (undefined behavior)?
Gedrag waaraan de standaard van C of C++ geen eisen stelt. Voorbeelden zijn overloop van integers met teken, lezen of schrijven buiten een array, het derefereren van een NULL-pointer, vrijgegeven geheugen gebruiken en een negatieve waarde naar links schuiven. Een compiler mag optimaliseren in de veronderstelling dat een correct programma nooit ongedefinieerd gedrag heeft, dus zulke code kan toevallig werken zoals verwacht, maar ook onverwachte resultaten geven, bijvoorbeeld doordat een controle bij bepaalde optimalisatie-instellingen verdwijnt. Het wordt onderscheiden van door de implementatie bepaald gedrag (implementation-defined), dat de implementatie kiest en documenteert.
Japanse benaming: 未定義動作
“Ongedefinieerd gedrag (undefined behavior)” komt voor in 10 oefenvragen uit 2 onderwerpen, bijv. Basis van programmeren in C, Compilers.
Vakgebied: Basis van programmeren in C
Typische voorbeelden
Voorbeelden zijn overloop bij rekenen met integers met teken (zoals INT_MAX + 1), lezen of schrijven buiten een array, de waarde van een niet-geïnitialiseerde automatische variabele gebruiken, lezen of schrijven via een NULL-pointer of een dangling pointer, hetzelfde geheugen twee keer vrijgeven, het delen van een geheel getal door 0, en verschuiven over de breedte van het type of meer of een negatieve waarde naar links schuiven. Overloop van integers zonder teken is geen ongedefinieerd gedrag: daarvoor ligt vast dat het resultaat de rest bij deling door een macht van 2 is.
Veelgestelde vragen
Wat is het verschil tussen ongedefinieerd gedrag en door de implementatie bepaald gedrag?
Door de implementatie bepaald gedrag, zoals de grootte van int, of char een teken heeft, of het resultaat van het naar rechts schuiven van een negatieve waarde, is gedrag waarvoor de implementatie één mogelijkheid kiest en die documenteert. Ongedefinieerd gedrag is gedrag waaraan de standaard geen eisen stelt, en het resultaat mag zelfs bij dezelfde implementatie per situatie verschillen. Draagbare programma's maken elke afhankelijkheid van door de implementatie bepaald gedrag expliciet en vermijden ongedefinieerd gedrag volledig.
Is ongedefinieerd gedrag een probleem als het programma toch werkt?
Ja. Ook als het in de huidige omgeving toevallig werkt zoals verwacht, kan een andere optimalisatie-instelling, compilerversie of omringende code een ander resultaat geven. Ook voor de beveiliging is het een probleem: ongedefinieerd gedrag zoals schrijven buiten de grenzen kan door aanvallers worden misbruikt.