Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Определение [ править ]

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

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

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

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

Примеры [ править ]

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

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

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

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

#include  <iostream>int  f ()  {  std :: cout  <<  "В f \ n " ;  возврат  3 ; }int  g ()  {  std :: cout  <<  "В g \ n " ;  возврат  4 ; }int  sum ( int  i ,  int  j )  {  return  i  +  j ; }int  main ()  {  вернуть  сумму ( f (),  g ());  }

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

См. Также [ править ]

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

  1. ^ а б в г ИСО / МЭК (2009-05-29). ISO / IEC PDTR 24772.2: Руководство по предотвращению уязвимостей в языках программирования посредством выбора и использования языка
  2. ^ a b c Беккер, Пит (16.05.2006). «Жить по правилам» . Журнал доктора Добба . Проверено 26 ноября 2009 года .
  3. ^ Хенриксон, Матс; Найквист, Эрик (1997). Промышленная сила C ++ . Прентис Холл. ISBN 0-13-120965-5.
  4. ^ а б в ИСО / МЭК (2003). ISO / IEC 14882: 2003 (E): Языки программирования - С ++ §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