Más comportamiento indefinido en C
Desplazar de más, leer memoria sin inicializar, dividir entre cero — y sus guardas.
#include <limits.h>
int shift_safely(unsigned int value, unsigned int by) {
if (by >= sizeof(unsigned int) * CHAR_BIT) {
return 0;
}
return (int) (value << by);
}
int divide_safely(int a, int b, int *out) {
if (b == 0 || (a == INT_MIN && b == -1)) {
return 0;
}
*out = a / b;
return 1;
}
int initialized(void) {
int value = 0;
return value;
}
Cómo funciona
- Desplazar por el ancho del tipo es indefinido, no cero.
INT_MIN / -1desborda, así que la división necesita dos chequeos.- Una lectura sin inicializar puede devolver cualquier cosa.
Palabras clave y builtins usados aquí
ifintreturnsizeofunsignedvoid
El intento, en números
- Líneas
- 21
- Caracteres a escribir
- 345
- Tokens
- 111
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 63 segundos.
Paso 3 de 3 en Comportamiento indefinido; paso 10 de 13 en Uniones, campos de bits y comportamiento indefinido.