Неопределенное поведение

Различное поведение идентично закодированных программ при компиляции

В компьютерном программировании неопределенное поведение — это поведение, которое может различаться в разных реализациях языка программирования . [ необходимо разъяснение ] Можно сказать, что программа содержит неопределенное поведение, когда ее исходный код может создавать исполняемый файл , который демонстрирует различное поведение при компиляции на другом компиляторе или на том же компиляторе с разными настройками, или даже в разных частях одного и того же исполняемого файла. Хотя соответствующие языковые стандарты или спецификации могут налагать ряд возможных поведений, точное поведение зависит от реализации и может быть не полностью определено при изучении исходного кода программы. [1] Неопределенное поведение часто не будет проявляться во внешнем поведении результирующей программы, но иногда оно может приводить к различным выводам или результатам, потенциально вызывая проблемы переносимости .

Определение

Чтобы компиляторы могли создавать оптимальный код для соответствующих целевых платформ, стандарты языков программирования не всегда навязывают определенное конкретное поведение для данной конструкции исходного кода. [2] Отсутствие явного определения точного поведения каждой возможной программы не считается ошибкой или слабостью спецификации языка, и сделать это было бы нецелесообразно. [1] В языках C и C++ такие непереносимые конструкции обычно группируются в три категории: определяемое реализацией, неуказанное и неопределенное поведение . [3]

Точное определение неопределенного поведения различается. В C++ оно определяется как «поведение, для правильно сформированной программной конструкции и правильных данных, которое зависит от реализации». [4] Стандарт C++ также отмечает, что диапазон возможных поведений обычно предоставляется. [4] В отличие от поведения, определяемого реализацией, нет требования к реализации документировать свое поведение. [4] Аналогично, стандарт C определяет его как поведение, для которого стандарт «предоставляет две или более возможностей и не налагает дополнительных требований на то, какой из них выбирается в любом случае». [5] Неопределенное поведение отличается от неопределенного поведения . Последнее обычно является результатом ошибочной программной конструкции или данных, и никаких требований к трансляции или выполнению таких конструкций не предъявляется. [6]

Поведение, определяемое реализацией

C и C++ различают поведение, определяемое реализацией, и неопределенное поведение. Для поведения, определяемого реализацией, реализация должна выбрать определенное поведение и задокументировать его. Примером в C/C++ является размер целочисленных типов данных. Выбор поведения должен соответствовать задокументированному поведению в рамках данного выполнения программы.

Примеры

Порядок оценки подвыражений

Многие языки программирования не определяют порядок оценки подвыражений полного выражения . Этот недетерминизм может позволить оптимальные реализации для определенных платформ, например, для использования параллелизма. Если одно или несколько подвыражений имеют побочные эффекты , то результат оценки полного выражения может отличаться в зависимости от порядка оценки подвыражений. [1] Например, учитывая

а = f ( б ) + g ( б );    

, где fи gоба изменяют b, результат, сохраненный в , aможет отличаться в зависимости от того, вычисляется ли f(b)или первым. [1] В языках C и C++ это также применимо к аргументам функций. Пример: [2]g(b)

#include <iostream> int f () { std :: cout << "In f \n " ; return 3 ; }        int g () { std :: cout << "В g \n " ; return 4 ; }       int sum ( int i , int j ) { return i + j ; }         int main () { return sum ( f (), g ()); }      

Полученная программа запишет две строки вывода в неопределенном порядке. [2] В некоторых других языках, таких как Java , порядок вычисления операндов и аргументов функций определен явно. [7]

Смотрите также

Ссылки

  1. ^ abcd ISO/IEC (2009-05-29). ISO/IEC PDTR 24772.2: Руководство по предотвращению уязвимостей в языках программирования посредством выбора и использования языка
  2. ^ abc Беккер, Пит (2006-05-16). "Жизнь по правилам". Журнал доктора Добба . Получено 26 ноября 2009 г.
  3. ^ Хенриксон, Матс; Найквист, Эрик (1997). Industrial Strength C++ . Prentice Hall. ISBN 0-13-120965-5.
  4. ^ abc ISO / IEC (2003). ISO/IEC 14882:2003(E): Языки программирования - C++ §1.3.13 неопределенное поведение [defns.unspecified]
  5. ^ ISO / IEC (1999). ISO/IEC 9899:1999(E): Языки программирования - C §3.4.4, пункт 1
  6. ^ ISO / IEC (2003). ISO/IEC 14882:2003(E): Языки программирования - C++ §1.3.12 неопределенное поведение [defns.undefined]
  7. ^ Джеймс Гослинг , Билл Джой , Гай Стил и Гилад Браха (2005). Спецификация языка Java , третье издание. Эддисон-Уэсли. ISBN 0-321-24678-0 
Получено с "https://en.wikipedia.org/w/index.php?title=Неопределенное_поведение&oldid=1225187113"