Nedefinované chování ( anglicky undefined behavior , v řadě zdrojů nepředvídatelné chování [1] [2] ) je vlastnost některých programovacích jazyků (nejzřetelnější v C ), softwarových knihoven a hardwaru v určitých okrajových situacích produkovat výsledek, který závisí na implementaci kompilátoru (knihovna, mikročipy) a náhodných faktorech, jako je stav paměti nebo spuštěné přerušení . Jinými slovy, specifikacenedefinuje chování jazyka (knihovny, čipu) ve všech možných situacích, ale říká: "za podmínky A je výsledek operace B nedefinovaný." Povolení takové situace v programu je považováno za chybu; i když program běží úspěšně na nějakém kompilátoru, nebude multiplatformní a může selhat na jiném počítači, v jiném OS nebo s jiným nastavením kompilátoru.
Nedefinované chování by nemělo být zaměňováno s nespecifikovaným chováním , ve kterém specifikace neumožňuje žádné chování, ale pouze omezený rozsah možností implementace.
Například v C vede použití proměnné před její inicializací k nedefinovanému chování. Podle specifikace by měl kompilátor udělat to, co se v tomto případě zdá nejefektivnější/nejjednodušší. K nedefinovanému chování dochází při pokusu o přístup k proměnné.
Knihovny nemusí kontrolovat ukazatele NULL z důvodu výkonu.
V procesorech x86 , pokud existují dva sériové I/O porty a chcete zapsat informace nejprve na jeden port a poté na druhý, mělo by to být provedeno po jednom bajtu, protože pořadí příchodu bajtů do zařízení je není zaručeno.
Další příklad nedefinovaného chování: kuriozita s ANSI - direktiva "#pragma" . Podle specifikace jazyka mají kompilátory úplnou volnost při manipulaci s tímto konstruktem. Před verzí 1.17 se kompilátor GCC , když byla tato směrnice ve zdrojovém kódu, pokusil spustit Emacs s hrou Towers of Hanoi. [3]
Dalším příkladem nedefinovaného chování je následující kód:
int i = 5 ; i = ++ i + ++ i ;Při spuštění může proměnná inabývat hodnot 13 nebo 14 pro C/C++, 13 pro Java , PHP a C# , 12 při implementaci v LISP . Nejistota v C a C++ je způsobena skutečností, že podle standardů C a C++ mohou být vedlejší efekty (tedy v tomto případě přírůstek) aplikovány v jakémkoli místě vhodném pro kompilátor mezi dvěma body sekvence .