stringtranslate.com

Comportamiento no especificado

En programación de computadoras , el comportamiento no especificado es un comportamiento que puede variar en diferentes implementaciones de un lenguaje de programación . [ se necesita aclaración ] 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 configuraciones diferentes, o incluso en diferentes partes del mismo ejecutable. . Si bien los respectivos estándares o especificaciones del lenguaje pueden imponer una variedad de comportamientos posibles, el comportamiento exacto depende de la implementación y puede no determinarse completamente 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 generar 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 de los lenguajes de programación no siempre imponen un comportamiento específico determinado 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 generalmente se agrupan en tres categorías: comportamiento definido por la 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 la gama 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 C lo define como un comportamiento para el cual el estándar "ofrece dos o más posibilidades y no impone requisitos adicionales sobre cuál se elige en cualquier caso". [5] El comportamiento no especificado es diferente del comportamiento no definido . Esto último suele ser el resultado de una construcción o datos del programa erróneos, y no se imponen requisitos a 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

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, utilizar el paralelismo. Si una o más de las subexpresiones tienen efectos secundarios , entonces 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 ( segundo ) + gramo ( segundo );    

, 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 " ; devolver 3 ; }        int g () { std :: cout << "En g \n " ; devolver 4 ; }       int suma ( int i , int j ) { retorno 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 algunos otros lenguajes, como Java , el orden de evaluación de los operandos y argumentos de función se define explícitamente. [7]

Ver también

Referencias

  1. ^ abcdISO /IEC (29 de mayo de 2009). 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. ^ abc Becker, Pete (16 de mayo de 2006). "Vivir según las reglas". Diario del Dr. Dobb . Consultado el 26 de noviembre de 2009 .
  3. ^ Henricson, esteras; Nyquist, Erik (1997). Fuerza industrial C++ . Prentice Hall. ISBN 0-13-120965-5.
  4. ^ abc 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.undefinido]
  7. ^ James Gosling , Bill Joy , Guy Steele y Gilad Bracha (2005). La especificación del lenguaje Java , tercera edición. Addison-Wesley. ISBN 0-321-24678-0