Неопределенное поведение
В компьютерном программировании неопределённое поведение — это поведение, которое может различаться в разных реализациях языка программирования . [ нужны разъяснения ] содержит программа Можно сказать, что неопределенное поведение, когда ее исходный код может создавать исполняемый файл , который демонстрирует различное поведение при компиляции на другом компиляторе , или на одном и том же компиляторе с разными настройками, или даже в разных частях одного и того же исполняемого файла. Хотя соответствующие языковые стандарты или спецификации могут налагать ряд возможных вариантов поведения, точное поведение зависит от реализации и не может быть полностью определено при изучении исходного кода программы. [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]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с д ИСО/МЭК (29 мая 2009 г.). ISO/IEC PDTR 24772.2: Руководство по предотвращению уязвимостей в языках программирования посредством выбора и использования языка
- ^ Jump up to: а б с Беккер, Пит (16 мая 2006 г.). «Жизнь по правилам» . Журнал доктора Добба . Проверено 26 ноября 2009 г.
- ^ Хенриксон, Матс; Найквист, Эрик (1997). Промышленная мощь C++ . Прентис Холл. ISBN 0-13-120965-5 .
- ^ Jump up to: а б с ИСО / МЭК (2003). ISO/IEC 14882:2003(E): Языки программирования — C++ §1.3.13, поведение не указано [defns.unspecified]
- ^ ИСО / МЭК (1999). ISO/IEC 9899:1999(E): Языки программирования – C §3.4.4, параграф 1
- ^ ИСО / МЭК (2003). ISO/IEC 14882:2003(E): Языки программирования – C++ §1.3.12 неопределенное поведение [defns.undefined]
- ^ Джеймс Гослинг , Билл Джой , Гай Стил и Гилад Брача (2005). Спецификация языка Java , третье издание. Аддисон-Уэсли. ISBN 0-321-24678-0