Nedefinované chování

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 15. dubna 2014; kontroly vyžadují 20 úprav .

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.

Příklady

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 .

Výhody

  • Definování některých operací jako „nedefinovaných“ vede takové jazyky (často charakteristické nedostatkem vestavěné kontroly limitů atd.) ke zjednodušení specifikace a zvýšení určité flexibility.
  • Práce programů je zrychlena (protože není nutné kontrolovat všechny druhy "okrajových" případů).

Nevýhody

  • Nezaručuje plnou kompatibilitu mezi různými implementacemi jazyka.
  • Je na programátorovi, aby se vyhnul situacím nedefinovaného chování.

Poznámky

  1. Programování v C/C++. Výukový program . — Dialektika, 2003-01-01. — 348 s. — ISBN 9785845904607 .
  2. Pavlovská Taťána Alexandrovna. C/C++. Procedurální a objektově orientované programování. Učebnice pro střední školy. Standard 3. generace . — "Nakladatelství" "Peter" "", 2014-07-30. — 496 s. — ISBN 9785496001090 .
  3. Pragmatické rozhodnutí | D-Mac's Stuff . Datum přístupu: 21. března 2009. Archivováno z originálu 1. června 2009.

Odkazy