Odefinierat beteende ( engelska undefined behavior , i ett antal källor oförutsägbart beteende [1] [2] ) är en egenskap hos vissa programmeringsspråk (mest märkbar i C ), mjukvarubibliotek och hårdvara i vissa marginella situationer för att producera ett resultat som beror på implementeringen av kompilatorn (bibliotek, mikrochips) och slumpmässiga faktorer som minnets tillstånd eller det utlösta avbrottet . Med andra ord, specifikationen definierar inte språkets beteende (bibliotek, chip) i alla möjliga situationer, utan säger: "under villkor A är resultatet av operation B odefinierat." Att tillåta en sådan situation i programmet anses vara ett misstag; även om programmet körs framgångsrikt på någon kompilator, kommer det inte att vara plattformsoberoende och kan misslyckas på en annan dator, i ett annat operativsystem eller med andra kompilatorinställningar.
Odefinierat beteende ska inte förväxlas med ospecificerat beteende , där specifikationen inte tillåter något beteende, utan endast ett begränsat utbud av implementeringsalternativ.
I C, till exempel, resulterar användning av en variabel innan den har initierats i odefinierat beteende. Enligt specifikationen ska kompilatorn göra det som verkar mest effektivt/enklast i det här fallet. Odefinierat beteende uppstår när ett försök görs att komma åt en variabel.
Bibliotek kanske inte kontrollerar NULL- pekare av prestandaskäl.
I x86-processorer , om det finns två seriella I/O-portar och du vill skriva information först till en port och sedan till den andra, bör detta göras en byte i taget, eftersom ordningen för ankomsten av bytes till utrustningen är inte garanterat.
Ett annat exempel på odefinierat beteende: en nyfikenhet med ANSI - "#pragma"-direktivet . Enligt språkspecifikationen ges kompilatorer fullständig frihet att hantera denna konstruktion. Före version 1.17 försökte GCC- kompilatorn, när detta direktiv fanns i källkoden, att starta Emacs med Towers of Hanoi-spelet. [3]
Ett annat exempel på odefinierat beteende är följande kod:
int i = 5 ; i = ++ i + ++ i ;När den exekveras kan variabeln ianta värdena 13 eller 14 för C/C++, 13 för Java , PHP och C# , 12 när den implementeras i LISP . Osäkerheten i C och C++ beror på det faktum att enligt C- och C++-standarderna kan biverkningar (det vill säga en ökning i det här fallet) appliceras när som helst som är lämplig för kompilatorn mellan två sekvenspunkter .