Неопределённое поведение
Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Cи и Си++) в определённых ситуациях выдавать результат, зависящий от реализации компилятора или заданных ключей оптимизации. Другими словами, спецификация не определяет поведение языка в любых возможных ситуациях, а говорит: "при условии А результат операции Б не определён". Допускать такую ситуацию в программе считается ошибкой, даже если на некотором компиляторе программа успешно выполняется. Такая программа не будет кроссплатформенной и может приводить к сбоям на другой машине, в другой ОС и даже на других настройках компилятора.
Неопределенное поведение не следует путать с неуточняемым поведением (unspecified behavior), при котором спецификация разрешает не любое поведение, а только ограниченный диапазон вариантов реализации.
Примеры ситуаций, приводящих к неопределённому поведению:
- Использование переменной до её инициализации. Неопределённое поведение возникает при попытке обращения к переменной.
- Выделение памяти с использованием оператора new [] и последующее её освобождение с использованием оператора delete. Пример: T *p = new T[10]; delete p;. Правильный вариант: T *p = new T[10]; delete [] p;.
- Переменная несколько раз изменяется в рамках одной точки следования. Часто в качестве канонического примера приводят выражение i=i++, в котором происходит присваивание переменной i и её же инкремент. Более подробно с данной разновидностью ошибок можно познакомиться в разделе "точки следования".
Библиографический список
- Wikipedia. Неопределённое поведение.
- Wikipedia. Точка следования.
- Терминология. Точки следования. http://www.viva64.com/ru/t/0065/
- Елена Сагалаева. Разница между unspecified behavior и undefined behavior. http://alenacpp.blogspot.ru/2005/08/unspecified-behavior-undefined.html
- John Regehr. A Guide to Undefined Behavior in C and C++. http://blog.regehr.org/archives/213
- Неопределённое поведение и теорема Ферма. http://habrahabr.ru/post/229963/
- Андрей Карпов. Разыменовывание нулевого указателя приводит к неопределённому поведению. http://www.viva64.com/ru/b/0306/
0