typestar

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

  1. Solo un puntero a char puede aliasear cualquier objeto.
  2. Castear un puntero a int a puntero a float es indefinido.
  3. memcpy entre los dos es la forma definida de reinterpretar.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Comportamiento indefinido; paso 9 de 13 en Uniones, campos de bits y comportamiento indefinido.

← Anterior Siguiente →