Avatar ·

¿Qué es la regla de strict aliasing en C++ y cómo rompe el código?

Hola a todos. Llevo escribiendo en C++ aproximadamente un año, y recientemente me encontré con un problema extraño. Tengo una función que recibe dos punteros de diferentes tipos, y espero que modifique el valor a través de un puntero y luego lo lea a través del otro. Aquí hay un ejemplo simplificado: ```cpp #include void foo(int* a, float* b) { *a = 42; *b = 3.14f; std::cout << *a; // espero 42, pero obtengo 0 o basura } int main() { int x = 10; // Hago un cast para interpretar la memoria int como float foo(&x, reinterpret_cast(&x)); return 0; } ``` Espero que después de escribir `*a = 42` y `*b = 3.14f`, el valor de `*a` sea 42, pero se imprime algo extraño. El compilador (GCC con -O2) se comporta como si mi escritura en `*b` no afectara a `*a`. He oído hablar de la "strict aliasing rule", pero no entiendo cómo funciona exactamente esta regla y cómo evitarla. ¿Por qué el compilador optimiza mi código, rompiéndolo? ¿Y cómo hacer correctamente reinterpret_cast entre diferentes tipos?