Comportamiento indefinido

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 15 de abril de 2014; las comprobaciones requieren 20 ediciones .

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.

Ejemplos

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 .

Ventajas

  • Definir algunas operaciones como "indefinidas" lleva a dichos lenguajes (caracterizados a menudo por la falta de verificación de límites incorporada, etc.) a simplificar la especificación y aumentar cierta flexibilidad.
  • El trabajo de los programas se acelera (ya que no es necesario verificar todo tipo de casos "marginales").

Desventajas

  • No garantiza la compatibilidad total entre diferentes implementaciones del lenguaje.
  • Depende del programador evitar situaciones de comportamiento indefinido.

Notas

  1. Programación en C/C++. Tutoría . — Dialéctica, 2003-01-01. — 348 pág. — ISBN 9785845904607 .
  2. Pavlovskaya Tatiana Alexandrovna. C/C++. Programación procedimental y orientada a objetos. Libro de texto para escuelas secundarias. Estándar de 3ra generación . — "Editorial" "Peter" "", 2014-07-30. — 496 pág. — ISBN 9785496001090 .
  3. Una decisión pragmática | Cosas de D-Mac . Fecha de acceso: 21 de marzo de 2009. Archivado desde el original el 1 de junio de 2009.

Enlaces