Comportamiento indefinido en C ++


La situación en la que el código C ++ es sintácticamente válido, pero su comportamiento no está definido en el Estándar, a menudo se denomina simplemente comportamiento indefinido en la literatura en ruso. En el Estándar mismo, para tales situaciones hay hasta 3 términos: comportamiento indefinido , comportamiento no especificado y comportamiento definido por la implementación . En esta breve nota entenderemos en qué se diferencian.


Comportamiento definido por la implementación


Este término se usa para describir situaciones en las que el código C ++ es completamente válido, pero su comportamiento depende de la implementación (por ejemplo, el compilador o el tiempo de ejecución), y este comportamiento está documentado . Por ejemplo, el tamaño en bytes de un puntero o tipo int depende de la implementación particular o la configuración del compilador, pero esto se describe en la documentación y puede confiar en esta documentación.


Comportamiento no especificado


El término significa que el comportamiento del código C ++ válido no está definido por el Estándar y depende de la implementación, además, no está documentado (al menos oficialmente). Ejemplo: el compilador determina el procedimiento para calcular los valores de los argumentos de la función, pero en ninguna parte hay una descripción de cómo. El estándar nos dice: estas son características de comportamiento que no se arreglan en ningún lado, por lo tanto, no puede confiar en ellas. Por lo tanto, el comportamiento de su código no debe depender de estas características.


Comportamiento indefinido


Esta es la variante más peligrosa de la incertidumbre. En el Estándar, se usa para describir comportamientos que pueden conducir a consecuencias completamente impredecibles. Los ejemplos más llamativos son acceder a los límites de una matriz o desreferenciar un puntero a un objeto liberado. La peor parte es que el programa no tiene que finalizar de inmediato ni producir ningún error, sin embargo, ya no se puede confiar en su comportamiento.


En conclusión, le recuerdo una vez más que todos los términos anteriores se refieren al código sintácticamente válido que se compilará con éxito (sin embargo, los compiladores a menudo dan advertencias para los casos más obvios de comportamiento indefinido ). El código que no es válido desde el punto de vista del Estándar se llama programa mal formado .

Source: https://habr.com/ru/post/450910/


All Articles