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


Неопределённое поведение (англ. undefined behavior, в ряде источников непредсказуемое поведение[1][2]) — ситуация, когда в определённых маргинальных случаях поведение программного продукта или устройства может меняться неконтролируемым образом и приводить к некорректным результатам, но это не является ошибкой, и о такой возможности указано в спецификации. Как правило, предполагается, что пользователь данного продукта имеет достаточную компетенцию, чтобы избежать этих случаев. Чаще всего речь идёт о неопределённом поведении в языках программирования.

Неопределенное поведение не следует путать с неуточняемым поведением (unspecified behavior), при котором спецификация разрешает не любое поведение, а только ограниченный диапазон вариантов реализации.

В качестве примера можно привести арифметические операции с переполнением. Например, необходимо вычислить в целых числах значение

При небольших значениях a и b пример всегда решается корректно. Но если превысит максимальный для данной платформы результат, возникнет неопределённость:

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

Также оптимизирующий компилятор исходя из знания об ограничениях платформы может сделать вывод о максимально возможных значениях переменных, и выполнить оптимизации, которые могут работать некорректно при выходе этих переменных за данный диапазон — и неопределённое поведение может появиться вне выражения, собственно это неопределённое поведение вызвавшего. Например, если известно, что переменная всегда больше 24 576, компилятор может посчитать, что переменная всегда меньше 8192. Если при этом в коде где-то есть проверка, больше ли чем 8192, которая при этом не меняет переменных и и не влияет на вычисление выражения, компилятор может посчитать, что её результат всегда будет равен true исключить её, даже если эта проверка осуществляется до исполнения выражения, вызывающего переполнение.