Топ питань
Часова шкала
Чат
Перспективи

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

З Вікіпедії, вільної енциклопедії

Remove ads

Неви́значена поведі́нка[1] (англ. undefined behavior) — властивість деяких мов програмування (найпомітніша в Сі) залишати результат деяких операцій невизначеним конкретно. Ця міра приводить до спрощення специфікації і деякого підвищення гнучкості подібних мов (що часто характеризуються відсутністю вбудованої перевірки на межі масиву тощо).

Невизначену поведінку не слід плутати з неспецифікованою поведінкою[1] (unspecified behavior), за якої специфікація дозволяє не будь-яку поведінку, а тільки обмежений діапазон варіантів реалізації.

Remove ads

Приклади

Узагальнити
Перспектива

В мові Сі використання змінної до її ініціалізації призводить до невизначеної поведінки. Згідно зі специфікацією, компілятор повинен у цьому випадку зробити щось, що може здатися найефективнішим/простим. Невизначена поведінка виникає за спроби звернення до змінної.

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

Remove ads

Переваги

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

Недоліки

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

Див. також

Примітки

Посилання

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads