¿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?
No answers yet.
Inicia sesión para dejar una respuesta