Comportamiento indefinido en C++ (Undefined Behavior)

El estándar ISO del lenguaje C++ establece reglas sintácticas y semánticas que conducen, bajo un estricto cumplimiento de las mismas, a programas bien definidos. Ciertos aspectos y operaciones de la máquina abstracta del lenguaje son descritos como dependientes de la implementación (implementation-defined), como por ejemplo el tamaño de un entero sizeof(int). Hablamos aquí de los parámetros de la máquina abstracta, los cuales deben ser adecuadamente documentados por la implementación (véase el punto 4.1.1.2 de [1]).

Otros aspectos y operaciones, por su parte, se describen sin especificar (unspecified), como por ejemplo el orden de evaluación de los argumentos en una llamada a función. Ello introduce características no-deterministas en la máquina abstracta: una instancia de la máquina abstracta puede tener más de una ejecución posible para un programa e input dados. En tales casos, y siempre que sea posible, el estándar trata de definir el conjunto de comportamientos permitidos (punto 4.1.1.3 de [1]), si bien la implementación no está obligada a documentar el comportamiento seguido en cada caso.

En este artículo centraremos nuestra atención en las operaciones descritas bajo la etiqueta de comportamiento indefinido (undefined behavior o simplemente UB), las cuales conducen a programas incorrectos (punto 4.1.1.4 de [1]). Entre tales operaciones, podríamos destacar [2, 3]: