﻿# Undefined behavior

Undefined behavior is a characteristic of certain programming languages \(most prominent in C and C\+\+\) to produce a result in certain situations that depends on compiler implementation or specified optimization switches\. In other words, the specification does not define the language's behavior in all possible situations but states: "in case of the A condition, the result of B operation is undefined"\. It is considered a mistake to allow such a situation in your program even if it is executed correctly with some particular compiler\. Such a program won't be a crossplatform one and may cause failures on a different computer, operating system and even with different compiler's settings\.

You should not mix up undefined behavior with [unspecified behavior](https://en.wikipedia.org/wiki/Unspecified_behavior), the latter being the case when the specification does allow  not every behavior possible but a restricted range of implementation variants\.

Below are examples of situations causing undefined behavior:

* Using a variable before initializing it\. Undefined behavior occurs when trying to use the variable\.
* Memory allocation using the new \[\] operator and subsequent release using the delete operator\. For example: T \*p \= new T\[10\]; delete p;\. The correct code is: T \*p \= new T\[10\]; delete \[\] p;\.
* A variable is changed several times within one sequence point\. As a canonical example, the i\=i\+\+ expression is often cited where assignment of the i variable and its increment are performed at the same time\. To learn more about this kind of errors, read the section "[sequence points](https://pvs-studio.com/en/blog/terms/0065/)"\.

## References

1. Andrey Karpov, Dmitry Sviridkin\. [C\+\+ programmer's guide to undefined behavior](https://pvs-studio.com/en/blog/posts/cpp/1215/)\.
1. Wikipedia\. [Undefined behavior\.](https://en.wikipedia.org/wiki/Undefined_behavior) 
1. Wikipedia\. [Sequence point](https://en.wikipedia.org/wiki/Sequence_point)\. 
1. Terminology\. [Sequence points](https://pvs-studio.com/en/blog/terms/0065/)\. 
1. John Regehr\. [A Guide to Undefined Behavior in C and C\+\+](https://blog.regehr.org/archives/213)\.
1. The Old New Thing\. [Undefined behavior can result in time travel \(among other things, but time travel is the funkiest\)](https://devblogs.microsoft.com/oldnewthing/20140627-00/?p=633)\.
1. John Regehr\. [C Compilers Disprove Fermat's Last Theorem](https://blog.regehr.org/archives/140)\. 
1. Andrey Karpov\. [Null Pointer Dereferencing Causes Undefined Behavior](https://pvs-studio.com/en/blog/posts/cpp/0306/)\.