Невизначена поведінка
Неви́значена поведі́нка[1] (англ. undefined behavior) — властивість деяких мов програмування (найпомітніша в Сі) залишати результат деяких операцій невизначеним конкретно. Ця міра приводить до спрощення специфікації і деякого підвищення гнучкості подібних мов (що часто характеризуються відсутністю вбудованої перевірки на межі масиву тощо).
Невизначену поведінку не слід плутати з неспецифікованою поведінкою[1] (unspecified behavior), за якої специфікація дозволяє не будь-яку поведінку, а тільки обмежений діапазон варіантів реалізації.
В мові Сі використання змінної до її ініціалізації призводить до невизначеної поведінки. Згідно зі специфікацією, компілятор повинен у цьому випадку зробити щось, що може здатися найефективнішим/простим. Невизначена поведінка виникає за спроби звернення до змінної.
Бібліотеки, для вищої швидкодії, можуть не перевіряти вказівників на NULL.
У процесорах x86, якщо є два послідовних порти введення-виведення і треба записати інформацію спочатку в один порт, потім в інший, це треба робити по одному байту: порядок приходу байтів на обладнання не гарантується.
Прикладом невизначеної поведінки є незвичайна поведінка з ANSI-директивою «#pragma». Згідно зі специфікацією мови, компіляторам надано повну свободу під час обробки цієї конструкції. До версії 1.17 компілятор GCC, натрапивши в коді на цю директиву, намагався запустити Emacs зі грою «Ханойські вежі».[2]
Ще одним прикладом невизначеної поведінки є код:
int i = 5;
i = ++i + ++i;
Під час його виконання змінна i
може набути значення 13 або 14 для C/C++, 13 для Java, PHP і C#, 12 у реалізації на LISP. Невизначеність у мовах C і C++ пов'язана з тим, що згідно зі стандартами С і С++ побічні ефекти (тобто інкремент у цьому випадку) можуть бути застосованими в будь-який зручний для компілятора момент між двома точками перебігу.
- Визначення деяких операцій як «невизначених» призводить подібні мови (що характеризуються найчастіше відсутністю вбудованої перевірки меж масиву тощо) до спрощення специфікації і деякого підвищення гнучкості.
- Прискорюється робота програм (оскільки не потрібно перевіряти різних «межових» випадків).
- Не гарантує повної сумісності різних реалізацій мови.
- Недопущення ситуацій невизначеної поведінки покладається на програміста.
- ↑ а б Н. Д. Любашенко (2019). ПРОГРАМУВАННЯ-2. Мова С. КОНСПЕКТ ЛЕКЦІЙ (PDF). К.: КПІ ім. Ігоря Сікорського. с. 101.
- ↑ A Pragmatic Decision | D-Mac's Stuff. Архів оригіналу за 1 червня 2009. Процитовано 21 березня 2009.
- Мобільність на рівні програмних текстів [Архівовано 11 жовтня 2006 у Wayback Machine.]
Ця стаття не містить посилань на джерела. (червень 2011) |
Це незавершена стаття про програмування. Ви можете допомогти проєкту, виправивши або дописавши її. |