El comportamiento indefinido ( comportamiento indefinido en inglés , en varias fuentes comportamiento impredecible [1] [2] ) es una propiedad de algunos lenguajes de programación (más notable en C ), bibliotecas de software y hardware en ciertas situaciones marginales para producir un resultado que depende de la implementación del compilador (biblioteca, microchips) y de factores aleatorios como el estado de la memoria o la interrupción desencadenada . En otras palabras, la especificación no define el comportamiento del lenguaje (biblioteca, chip) en todas las situaciones posibles, sino que dice: "bajo la condición A, el resultado de la operación B es indefinido". Permitir tal situación en el programa se considera un error; incluso si el programa se ejecuta correctamente en algún compilador, no será multiplataforma y puede fallar en otra máquina, en otro sistema operativo o con configuraciones de compilador diferentes.
El comportamiento indefinido no debe confundirse con el comportamiento no especificado , en el que la especificación no permite ningún comportamiento, sino solo una gama limitada de opciones de implementación.
En C, por ejemplo, usar una variable antes de que se haya inicializado da como resultado un comportamiento indefinido. De acuerdo con la especificación, el compilador debe hacer lo que parezca más eficiente/simple en este caso. El comportamiento indefinido se produce cuando se intenta acceder a una variable.
Es posible que las bibliotecas no comprueben los punteros NULL por motivos de rendimiento.
En procesadores x86 , si existen dos puertos seriales de E/S y se desea escribir información primero a un puerto, luego al otro, esto debe hacerse byte a byte, ya que el orden de llegada de bytes al equipo es no garantizado
Otro ejemplo de comportamiento indefinido: una curiosidad con ANSI : la directiva "#pragma" . De acuerdo con la especificación del lenguaje, los compiladores tienen total libertad para manejar esta construcción. Antes de la versión 1.17, el compilador GCC , cuando esta directiva estaba en el código fuente, intentó iniciar Emacs con el juego Towers of Hanoi. [3]
Otro ejemplo de comportamiento indefinido es el siguiente código:
int i = 5 ; yo = ++ yo + ++ yo ;Cuando se ejecuta, la variable ipuede tomar los valores 13 o 14 para C/C++, 13 para Java , PHP y C# , 12 cuando se implementa en LISP . La incertidumbre en C y C++ se debe al hecho de que, de acuerdo con los estándares de C y C++, los efectos secundarios (es decir, un incremento en este caso) se pueden aplicar en cualquier punto conveniente para el compilador entre dos puntos de secuencia .