Comportamiento no especificado


De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

El comportamiento no especificado es un comportamiento que puede variar en diferentes implementaciones de un lenguaje de programación . [ aclaración necesaria ] Se puede decir que un programa contiene un comportamiento no especificado cuando su código fuente puede producir un ejecutable que exhibe un comportamiento diferente cuando se compila en un compilador diferente , o en el mismo compilador con diferentes configuraciones, o de hecho en diferentes partes del mismo ejecutable . Si bien los estándares o especificaciones del lenguaje respectivos pueden imponer una variedad de posibles comportamientos, 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 manifestará en el comportamiento externo del programa resultante, pero a veces puede dar lugar a salidas o resultados 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 del lenguaje de programación no siempre imponen un comportamiento específico para una construcción de código fuente determinada. [2] No definir explícitamente el comportamiento exacto de cada programa posible no se considera un error o debilidad en la especificación del lenguaje, y hacerlo sería inviable. [1] En los lenguajes C y C ++ , estas construcciones no portátiles se agrupan generalmente en tres categorías: comportamiento definido por implementación, no especificado y no definido . [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 C ++ también señala que generalmente se proporciona el rango de posibles comportamientos. [4] A diferencia del comportamiento definido por la implementación, no es necesario que la implementación documente su comportamiento. [4] De manera similar, el Estándar C lo define como un comportamiento para el cual el estándar "brinda dos o más posibilidades y no impone requisitos adicionales sobre el cual se elige en cualquier caso". [5] El comportamiento no especificado es diferente del comportamiento indefinido. Este último suele ser el resultado de una construcción o datos de programa erróneos, y no se imponen requisitos en la traducción o ejecución de dichas construcciones. [6]

Comportamiento definido por la implementación

C y C ++ distinguen el comportamiento definido por la implementación del comportamiento no especificado. Para el comportamiento definido por la implementación, la implementación debe elegir un comportamiento particular 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 dentro de una ejecución determinada del programa.

Ejemplos de

Orden de evaluación de 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 tiene efectos secundarios , el resultado de evaluar la expresión completa puede ser diferente según el orden de evaluación de las subexpresiones. [1] Por ejemplo, dado

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

, Donde fy gtanto Modificar b, el resultado se almacena en apuede ser diferente dependiendo de si f(b)o g(b)es evaluado 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 " ;   volver 3 ; }int g () {   std :: cout << "En g \ n " ;   volver 4 ; }int suma ( int i , int j ) {      return i + j ;   }int main () {   devolver 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]

Ver también

Referencias

  1. a b c d ISO / IEC (29 de mayo de 2009). ISO / IEC PDTR 24772.2: Guía para evitar vulnerabilidades en lenguajes de programación a través de la selección y el uso de idiomas
  2. a b c Becker, Pete (16 de mayo de 2006). "Viviendo según las reglas" . Diario del Dr. Dobb . Consultado el 26 de noviembre de 2009 .
  3. ^ Henricson, Mats; Nyquist, Erik (1997). Fuerza industrial C ++ . Prentice Hall. ISBN 0-13-120965-5.
  4. ^ a b c 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=1003765002 "