Неустановленное поведение - Unspecified behavior

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

Определение

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

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

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

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

Примеры

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

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

а = ж(б) + грамм(б);

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

#включают <iostream>int ж() {  стандартное::cout << "В ф п";  возвращаться 3;}int грамм() {  стандартное::cout << "В г п";  возвращаться 4;}int сумма(int я, int j) {  возвращаться я + j;}int главный() {  возвращаться сумма(ж(), грамм()); }

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

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

Рекомендации

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