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

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

Неопределенное поведение не следует путать с [неуточняемым поведением](https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8F%D0%B5%D0%BC%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5) \(unspecified behavior\), при котором спецификация разрешает не любое поведение, а только ограниченный диапазон вариантов реализации\.

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

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

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

1. Андрей Карпов, Дмитрий Свиридкин\. [Путеводитель C\+\+ программиста по неопределённому поведению](https://pvs-studio.ru/ru/blog/posts/cpp/1215/)\.
1. Wikipedia\. [Неопределённое поведение\.](https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5) 
1. Wikipedia\. [Точка следования\.](https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D0%BA%D0%B0_%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) 
1. Терминология\. [Точки следования](https://pvs-studio.ru/ru/blog/terms/0065/)\. 
1. Елена Сагалаева\. [Разница между unspecified behavior и undefined behavior](https://alenacpp.blogspot.com/2005/08/unspecified-behavior-undefined.html)\.
1. John Regehr\. [A Guide to Undefined Behavior in C and C\+\+](https://blog.regehr.org/archives/213)\.
1. Artyom Skrobov\. [Неопределённое поведение и теорема Ферма](https://habr.com/ru/articles/229963/)\.
1. Андрей Карпов\. [Разыменовывание нулевого указателя приводит к неопределённому поведению](https://pvs-studio.ru/ru/blog/posts/cpp/0306/)\.