Невизначена поведінка

Неви́значена поведі́нка[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++ пов'язана з тим, що згідно зі стандартами С і С++ побічні ефекти (тобто інкремент у цьому випадку) можуть бути застосованими в будь-який зручний для компілятора момент між двома точками перебігу.

Переваги ред.

  • Визначення деяких операцій як «невизначених» призводить подібні мови (що характеризуються найчастіше відсутністю вбудованої перевірки меж масиву тощо) до спрощення специфікації і деякого підвищення гнучкості.
  • Прискорюється робота програм (оскільки не потрібно перевіряти різних «межових» випадків).

Недоліки ред.

  • Не гарантує повної сумісності різних реалізацій мови.
  • Недопущення ситуацій невизначеної поведінки покладається на програміста.

Див. також ред.

Примітки ред.

  1. а б Н. Д. Любашенко (2019). ПРОГРАМУВАННЯ-2. Мова С. КОНСПЕКТ ЛЕКЦІЙ (PDF). К.: КПІ ім. Ігоря Сікорського. с. 101.
  2. A Pragmatic Decision | D-Mac's Stuff. Архів оригіналу за 1 червня 2009. Процитовано 21 березня 2009.

Посилання ред.