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


Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Cи и Си++) в определённых ситуациях выдавать результат, зависящий от реализации компилятора или заданных ключей оптимизации. Другими словами, спецификация не определяет поведение языка в любых возможных ситуациях, а говорит: "при условии А результат операции Б не определён". Допускать такую ситуацию в программе считается ошибкой, даже если на некотором компиляторе программа успешно выполняется. Такая программа не будет кроссплатформенной и может приводить к сбоям на другой машине, в другой ОС и даже на других настройках компилятора.

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

Примеры ситуаций, приводящих к неопределённому поведению:

  • Использование переменной до её инициализации. Неопределённое поведение возникает при попытке обращения к переменной.
  • Выделение памяти с использованием оператора new [] и последующее её освобождение с использованием оператора delete. Пример: T *p = new T[10]; delete p;. Правильный вариант: T *p = new T[10]; delete [] p;.
  • Переменная несколько раз изменяется в рамках одной точки следования. Часто в качестве канонического примера приводят выражение i=i++, в котором происходит присваивание переменной i и её же инкремент. Более подробно с данной разновидностью ошибок можно познакомиться в разделе "точки следования".

Библиографический список


А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++ и C#

goto PVS-Studio;