Articulo de referencia

Comportamiento no especificado

En programación informática , el comportamiento no especificado es aquel que puede variar en diferentes implementaciones de un lenguaje de programación . Se dice que un programa...

En programación informática , el comportamiento no especificado es aquel que puede variar en diferentes implementaciones de un lenguaje de programación . Se dice que un programa contiene comportamiento no especificado cuando su código fuente puede producir un ejecutable que exhibe un comportamiento diferente al compilarse en un compilador distinto , o en el mismo compilador con configuraciones diferentes, o incluso en distintas partes del mismo ejecutable. Si bien los estándares o especificaciones del lenguaje correspondiente pueden imponer un rango de comportamientos posibles, el comportamiento exacto depende de la implementación y puede no estar completamente determinado al examinar el código fuente del programa. [ 1 ] El comportamiento no especificado a menudo no se manifiesta en el comportamiento externo del programa resultante, pero a veces puede dar lugar a resultados o salidas diferentes, lo que podría causar problemas de portabilidad .

Definición

Para permitir que los compiladores produzcan código óptimo para sus respectivas plataformas de destino, los estándares de los lenguajes de programación no siempre imponen un comportamiento específico determinado para una construcción de código fuente dada. [ 2 ] No definir explícitamente el comportamiento exacto de cada programa posible no se considera un error o una debilidad en la especificación del lenguaje, y hacerlo sería inviable. [ 1 ] En los lenguajes C y C++ , dichas construcciones no portátiles generalmente se agrupan en tres categorías: comportamiento definido por la implementación, no especificado y comportamiento indefinido . [ 3 ]

La definición exacta de comportamiento no especificado varía. En C++, se define como "comportamiento, para una construcción de programa bien formada y datos correctos, que depende de la implementación". [ 4 ] El estándar de C++ también señala que generalmente se proporciona el rango de comportamientos posibles. [ 4 ] A diferencia del comportamiento definido por la implementación, no existe ningún requisito para que la implementación documente su comportamiento. [ 4 ] De manera similar, el estándar de C lo define como un comportamiento para el cual el estándar "proporciona dos o más posibilidades y no impone requisitos adicionales sobre cuál se elige en cada caso". [ 5 ] El comportamiento no especificado es diferente del comportamiento indefinido . Este último suele ser el resultado de una construcción de programa o datos erróneos, y no se imponen requisitos sobre la traducción o ejecución de dichas construcciones. [ 6 ]

Comportamiento definido por la implementación

C y C++ distinguen entre comportamiento definido por la implementación y comportamiento no especificado. En el caso del comportamiento definido por la implementación, esta debe elegir un comportamiento específico y documentarlo. Un ejemplo en C/C++ es el tamaño de los tipos de datos enteros. La elección del comportamiento debe ser coherente con el comportamiento documentado durante una ejecución determinada del programa.

Ejemplos

Orden de evaluación de las subexpresiones

Muchos lenguajes de programación no especifican el orden de evaluación de las subexpresiones de una expresión completa . Este no determinismo puede permitir implementaciones óptimas para plataformas específicas, por ejemplo, para utilizar el paralelismo. Si una o más de las subexpresiones tienen efectos secundarios , el resultado de evaluar la expresión completa puede ser diferente dependiendo del orden de evaluación de las subexpresiones. [ 1 ] Por ejemplo, dado

a = f ( b ) + g ( b );

, donde fy gambos modifican b, el resultado almacenado en apuede ser diferente dependiendo de si f(b)o g(b)se evalúa primero. [ 1 ] En los lenguajes C y C++, esto también se aplica a los argumentos de función. Ejemplo: [ 2 ]

#include <iostream> int f () { std :: cout << "En f \n " ; return 3 ; }int g () { std :: cout << "En g \n " ; return 4 ; }int suma ( int i , int j ) { return i + j ; }int main () { return suma ( f (), g ()); }

El programa resultante escribirá sus dos líneas de salida en un orden no especificado. [ 2 ] En otros lenguajes, como Java , el orden de evaluación de los operandos y los argumentos de las funciones se define explícitamente. [ 7 ]

Véase también

Referencias

  1. 1 2 3 4 ISO/IEC (2009-05-29). ISO/IEC PDTR 24772.2: Guía para evitar vulnerabilidades en lenguajes de programación mediante la selección y el uso del lenguaje.
  2. 1 2 3 Becker, Pete (16 de mayo de 2006). "Vivir según las reglas" . Dr. Dobb's Journal . Recuperado el 26 de noviembre de 2009 .
  3. Henricson, Mats; Nyquist, Erik (1997). Industrial Strength C++ . Prentice Hall. ISBN 0-13-120965-5.
  4. 1 2 3 ISO / IEC (2003). ISO/IEC 14882:2003(E): Lenguajes de programación - C++ §1.3.13 comportamiento no especificado [defns.unspecified]
  5. ISO / IEC (1999). ISO/IEC 9899:1999(E): Lenguajes de programación - C §3.4.4 párrafo 1
  6. ISO / IEC (2003). ISO/IEC 14882:2003(E): Lenguajes de programación - C++ §1.3.12 comportamiento indefinido [defns.undefined]
  7. James Gosling , Bill Joy , Guy Steele y Gilad Bracha (2005). Especificación del lenguaje Java , tercera edición. Addison-Wesley. ISBN 0-321-24678-0
Obtenido de " https://en.wikipedia.org/w/index.php?title=Unspecified_behavior&oldid=1315998534 "