Jump to content

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

(Перенаправлено с Неуказанного поведения )

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

Определение

[ редактировать ]

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

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

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

[ редактировать ]

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

Порядок вычисления подвыражений

[ редактировать ]

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

а   знак   равно ж  (  б  )   +   г  (  б  ); 

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

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

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

См. также

[ редактировать ]
  1. ^ Jump up to: а б с д ИСО/МЭК (29 мая 2009 г.). ISO/IEC PDTR 24772.2: Руководство по предотвращению уязвимостей в языках программирования посредством выбора и использования языка
  2. ^ Jump up to: а б с Беккер, Пит (16 мая 2006 г.). «Жизнь по правилам» . Журнал доктора Добба . Проверено 26 ноября 2009 г.
  3. ^ Хенриксон, Матс; Найквист, Эрик (1997). Промышленная мощь C++ . Прентис Холл. ISBN  0-13-120965-5 .
  4. ^ Jump up to: а б с ИСО / МЭК (2003). ISO/IEC 14882:2003(E): Языки программирования — C++ §1.3.13, поведение не указано [defns.unspecified]
  5. ^ ИСО / МЭК (1999). ISO/IEC 9899:1999(E): Языки программирования – C §3.4.4, параграф 1
  6. ^ ИСО / МЭК (2003). ISO/IEC 14882:2003(E): Языки программирования – C++ §1.3.12 неопределенное поведение [defns.undefined]
  7. ^ Джеймс Гослинг , Билл Джой , Гай Стил и Гилад Брача (2005). Спецификация языка Java , третье издание. Аддисон-Уэсли. ISBN   0-321-24678-0
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3ba127c542230a5f0eca9931a94770d8__1716403620
URL1:https://arc.ask3.ru/arc/aa/3b/d8/3ba127c542230a5f0eca9931a94770d8.html
Заголовок, (Title) документа по адресу, URL1:
Unspecified behavior - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)