Описание тега undefined-behavior

Непредсказуемый результат компиляции или выполнения программы, которая нарушает правила языка, которые не должны обеспечивать ни компилятор, ни интерпретатор, ни исполняющая система. НЕ ИСПОЛЬЗУЙТЕ этот тег для вопросов, касающихся типа данных или возвращаемого значения "undefined". В таких случаях следует использовать тег [undefined].

В компьютерном программировании неопределенное поведение (неофициально "UB") относится к компьютерному коду, поведение которого не определено стандартом языка программирования при определенных условиях.

Стандарты для некоторых языков, в первую очередь C и C++, оставить некоторые аспекты неопределенными, то есть стандартные накладывает никаких требований бы то ни было на исходе. Реализации могут рассматривать такие действия как ошибочные, диагностируя их или нет, как они считают нужным, или могут указывать, что они ведут себя некоторым, возможно, полезным образом, независимо от того, требует ли их этого Стандарт.

Например, доступ за пределы последнего элемента массива в C может быть диагностирован компилятором, если индекс массива известен во время компиляции, или может вернуть значение мусора из неинициализированной памяти, или вернуть явно разумное значение, или заставить программу работать сбой из-за доступа к памяти за пределами адресного пространства данных процесса.

Неопределенное поведение чаще всего вызывает путаницу и споры в ситуациях, когда некоторые части стандарта, документация по реализации, более ранний стандарт или язык программирования C от K&R описывают поведение некоторого действия, но другая часть Стандарта характеризует действие как Неопределенное поведение. В случаях, когда описанное поведение оказывается полезным для решаемой задачи, стоимость описанного поведения часто будет меньше, чем затраты программиста на поиск другого способа выполнить ту же задачу. Однако в тех случаях, когда это не способствует решению поставленной задачи, поддержание такого поведения может привести к увеличению затрат без какой-либо компенсирующей выгоды. Поскольку реализации используются для множества задач с разными требованиями и поскольку составители компиляторов должны иметь больше возможностей, чем комитет, чтобы знать потребности своих различных клиентов, авторы Стандарта рассматривают вопрос о том, следует ли вести себя так, как описано в таких случаях, как проблема "качества реализации" за пределами их юрисдикции.

Неопределенное поведение обычно сокращается до "UB". Эта неформальная аббревиатура часто встречается в обсуждениях неопределенного поведения.

Формальное определение неопределенного поведения, как указано в стандартах:

C11 3.4.3

неопределенное поведение
поведение при использовании непереносимой или ошибочной программной конструкции или ошибочных данных, для которых настоящий международный стандарт не налагает требований.

С ++11 1.3.24

неопределенное поведение
поведение, для которого данный международный стандарт не налагает требований.

[Примечание. Неопределенное поведение может ожидаться, если в этом международном стандарте отсутствует какое-либо явное определение поведения или когда программа использует ошибочную конструкцию или ошибочные данные. Допустимое неопределенное поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время трансляции или выполнения программы задокументированным образом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения трансляции или выполнения (с выдачей диагностического сообщения). Многие ошибочные программные конструкции не вызывают неопределенного поведения; они должны быть диагностированы. - конец примечания]

Использование тегов

Используйте этот тег для:

  • Вопросы о том, содержит ли определенный код неопределенное поведение.
  • Вопросы относительно различных форм документированного неопределенного поведения на данном языке программирования.

Избегайте использования этого тега для:

  • Вопросы, спрашивающие, почему неопределенное поведение дало определенный результат. На такие вопросы часто невозможно дать содержательный ответ.

Всегда используйте этот тег вместе с соответствующим тегом языка программирования.

Полезные вопросы по C и C++ / канонические дубликаты

Как объяснить неопределенное поведение всезнайкам?
Неопределенное, неопределенное и определяемое реализацией поведение.
Неопределенное поведение и точки последовательности.
Почему эти конструкции (использующие ++) имеют неопределенное поведение?

внешняя ссылка

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