Comportamiento indefinido: desbordamiento con signo en C
El desbordamiento con signo es indefinido: el compilador puede asumir que nunca pasa.
#include <limits.h>
/* El compilador puede asumir que a + 1 > a siempre se cumple. */
int broken_check(int a) {
return a + 1 > a;
}
/* Correcto: pregunta antes de que ocurra la aritmética. */
int safe_check(int a) {
return a < INT_MAX;
}
unsigned int wraps_defined(unsigned int a) {
return a + 1u;
}
Cómo funciona
- La aritmética sin signo envuelve y está bien definida.
- El desbordamiento con signo deja al optimizador borrar tu verificación.
- Así que prueba antes de la suma, nunca después.
Palabras clave y builtins usados aquí
intreturnunsigned
El intento, en números
- Líneas
- 15
- Caracteres a escribir
- 302
- Tokens
- 48
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 27 segundos.
Paso 1 de 3 en Comportamiento indefinido; paso 8 de 13 en Uniones, campos de bits y comportamiento indefinido.