Comportamiento indefinido: strict aliasing en C
Leer un objeto a través de un tipo de puntero ajeno rompe la regla de aliasing.
#include <string.h>
/* Indefinido: un objeto int leído como float. */
float punned(int bits) {
return *(float *) &bits;
}
/* Definido: copia los bytes a un float de verdad. */
float reinterpreted(int bits) {
float value;
memcpy(&value, &bits, sizeof value);
return value;
}
unsigned char first_byte(const void *object) {
return *(const unsigned char *) object;
}
Cómo funciona
- Solo un puntero a char puede aliasear cualquier objeto.
- Castear un puntero a int a puntero a float es indefinido.
memcpyentre los dos es la forma definida de reinterpretar.
Palabras clave y builtins usados aquí
charconstfloatintreturnsizeofunsignedvoid
El intento, en números
- Líneas
- 17
- Caracteres a escribir
- 365
- Tokens
- 69
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 39 segundos.
Paso 2 de 3 en Comportamiento indefinido; paso 9 de 13 en Uniones, campos de bits y comportamiento indefinido.