Неуточняемое поведение

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Неуточняемое поведение (англ. unspecified behavior) или поведение, определяемое реализацией (англ. implementation-defined behavior) — поведение компьютерной программы, которое может различаться на разных платформах и компиляторах поскольку спецификация языка программирования предлагает несколько допустимых вариантов реализации некой языковой конструкции. В отличие от неопределённого поведения, программа с неуточняемым поведением с точки зрения соответствия спецификации языка не считается ошибочной; при неуточняемом поведении, спецификация обычно ограничивает возможные варианты поведения, хотя и не сводит их в единое допустимое.

Терминология[править | править вики-текст]

Согласно стандарту языка C99,

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

ISO/IEC 9899:201x [1]

Согласно стандарту языка C++,

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

ISO/IEC 14882:2003(E)

Примеры[править | править вики-текст]

В языках Си и C++ (в отличие от языка Java) порядок вычисления параметров функции является неуточняемым; следовательно, в программе, указанной ниже, порядок, в котором будут напечатаны строки «F» и «G», зависит от компилятора.

#include <iostream>
int f() {
  std::cout << "F" << std::endl;
  return 3;
}
 
int g() {
  std::cout << "G" << std::endl;
  return 4;
}
 
int h(int i, int j) {
  return i + j;
}
 
int main() {
  return h(f(), g()); 
}

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

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]