Неспецифікована поведінка

поведінка комп'ютерної програми, яка може відрізнятися на різних платформах та компіляторах

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

Термінологія ред.

Відповідно до стандарту мови C99,

3.4.1. поведінка, визначена реалізацією (англ. implementation-defined behavior) — неспецифікована поведінка, вибір якої документується окремо в кожній реалізації;

3.4.3. неспецифікована поведінка (англ. unspecified behavior) — використання неспецифікованого значення або інша поведінка, де цей Міжнародний стандарт надає два або більше варіантів і не накладає жодних інших вимог на вибір у кожному конкретному випадку.
Оригінальний текст (англ.)
3.4.1 implementation-defined behavior

unspecified behavior where each implementation documents how the choice is made

[…]

3.4.3 unspecified behavior

use of an unspecified value, or other behavior where this International Standard provides two or more possibilities and imposes no further requirements on which is chosen in any instance

ISO/IEC 9899:201x [2]

Згідно зі стандартом мови C++,

  • 1.3.5. поведінка, визначена реалізацією (англ. implementation-defined behavior) — поведінка правильно побудованої програмної конструкції з правильними даними, що залежить від реалізації і яка має бути документована кожною реалізацією;
  • 1.3.13. неспецифікована поведінка (англ. unspecified behavior) — поведінка правильно побудованої програмної конструкції з правильними даними, що залежить від реалізації. Реалізація має документувати вибір поведінки. [Примітка: як правило, діапазон допустимих поведінок зазначено в цьому Міжнародному стандарті.]
Оригінальний текст (англ.)
1.3.5 implementation-defined behavior

behavior, for a well-formed program construct and correct data, that depends on the implementation and that each implementation shall document.

[…]

1.3.13 unspecifed behavior

behavior, for a well-formed program construct and correct data, that depends on the implementation. The implementation is not required to document which behavior occurs. [Note: usually, the range of possible

behaviors is delineated by this International Standard. ]

ISO/IEC 14882:2003(E)

Приклади ред.

У Сі і C++ (на відміну мови Java) порядок обчислення параметрів функції є неспецифікованим; отже, в програмі, наведеній нижче, порядок, у якому будуть надруковані рядки «F» та «G», залежить від компілятора.[3]

#include <iostream>
int f() {
  std::cout << "In f\n";
  return 3;
}

int g() {
  std::cout << "In g\n";
  return 4;
}

int sum(int i, int j) {
  return i + j;
}

int main() {
  return sum(f(), g()); 
}

Класичним прикладом поведінки, що визначається реалізацією (неспецифікованої поведінки, яка має документуватися реалізацією), є розмір типів даних; наприклад long у різних компіляторах та операційних системах може мати розмір 32 або 64 біт. Програма, яка передбачає, що в один long завжди поміститься вказівник, некоректно працюватиме на деяких платформах (наприклад, у Windows x64)[4].

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

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

  1. Н. Д. Любашенко (2019). ПРОГРАМУВАННЯ-2. Мова С. КОНСПЕКТ ЛЕКЦІЙ (PDF). К.: КПІ ім. Ігоря Сікорського. с. 101.
  2. ISO/IEC 9899:201x Committee Draft — August 11, 2008 (PDF) (англ.). Архів (PDF) оригіналу за 11 квітня 2012. Процитовано 1 грудня 2009.
  3. Becker, Pete (16 травня 2006). Living By the Rules. Dr. Dobb's Journal. Процитовано 26 листопада 2009.
  4. size of long integer type on different architecture and OS (англ.). Intel Software Network. Архів оригіналу за 11 квітня 2012. Процитовано 1 грудня 2009.

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