variable una tipos significado que programacion lenguaje ejemplos definicion declaracion declara crear como c++ undefined-behavior integer-overflow

una - tipos de variables en c++ y su significado



¿Qué tan desastroso es el desbordamiento de enteros en C++? (3)

Como lo señaló @Xeo en los comentarios (en realidad lo mencioné en el chat de C ++ primero):
Un comportamiento indefinido realmente significa eso y puede golpearte cuando menos lo esperas.

El mejor ejemplo de esto está aquí: ¿Por qué el desbordamiento de enteros en x86 con GCC causa un bucle infinito?

En x86, el desbordamiento de enteros con signo es solo un simple envolvente. Así que normalmente, se espera que suceda lo mismo en C o C ++ . Sin embargo, el compilador puede intervenir y utilizar un comportamiento indefinido como una oportunidad para optimizar .

En el ejemplo tomado de esa pregunta:

#include <iostream> using namespace std; int main(){ int i = 0x10000000; int c = 0; do{ c++; i += i; cout << i << endl; }while (i > 0); cout << c << endl; return 0; }

Cuando se compila con GCC, GCC optimiza la prueba de bucle y lo convierte en un bucle infinito.

Me preguntaba qué tan desastroso es el desbordamiento de enteros. Tome el siguiente programa de ejemplo:

#include <iostream> int main() { int a = 46341; int b = a * a; std::cout << "hello world/n"; }

Dado que a * a desborda en plataformas de 32 bits, y el desbordamiento de enteros desencadena un comportamiento indefinido, ¿tengo alguna garantía de que hello world aparecerá en mi pantalla?

Eliminé la parte "firmada" de mi pregunta en base a las siguientes citas estándar:

(§5 / 5 C ++ 03, §5 / 4 C ++ 11) Si durante la evaluación de una expresión, el resultado no está definido matemáticamente o no está en el rango de valores representables para su tipo, el comportamiento no está definido.

(§3.9.1 / 4) Los enteros unsigned , declarados unsigned , obedecerán las leyes del módulo aritmético 2 ^ n donde n es el número de bits en la representación del valor de ese tamaño particular de entero. Esto implica que la aritmética sin signo no se desborda porque un resultado que no puede ser representado por el tipo de entero sin signo resultante se reduce en módulo el número que es uno mayor que el valor más grande que puede ser representado por el tipo de entero sin signo resultante.


Hay dos puntos de vista sobre el comportamiento indefinido. Existe la vista que hay que reunir para hardware extraño y otros casos especiales, pero que normalmente debería comportarse de forma sensata. Y existe la opinión de que todo puede pasar. Y dependiendo de la fuente de la UB, algunos tienen diferentes opiniones.

Si bien el UB sobre desbordamiento probablemente se introdujo para tener en cuenta el hardware que atrapa o satura en el desbordamiento y la diferencia de resultados entre la representación, por lo que se puede argumentar la primera vista en este caso, las personas que escriben optimizadores sostienen la opinión de que Si el estándar no garantiza algo, realmente puede pasar cualquier cosa e intentan usar cada pieza de libertad para generar un código de máquina que se ejecute más rápidamente, incluso si el resultado ya no tiene sentido.

Entonces, cuando vea un comportamiento indefinido, asuma que puede pasar cualquier cosa, sin embargo, puede parecer razonable un comportamiento determinado.


Puede activar alguna característica de seguridad de hardware. Así que no, no tienes ninguna garantía.

Edición: Tenga en cuenta que gcc tiene la opción -ftrapv (pero no parece funcionar para mí).