Avatar ·

O que é a regra de aliasing estrito (strict aliasing rule) em C++ e como ela quebra o código?

Olá a todos. Escrevo em C++ há cerca de um ano e recentemente me deparei com um problema estranho. Tenho uma função que recebe dois ponteiros de tipos diferentes, e espero que ela altere o valor através de um ponteiro e depois o leia através do outro. Aqui está um exemplo simplificado: ```cpp #include void foo(int* a, float* b) { *a = 42; *b = 3.14f; std::cout << *a; // espero 42, mas recebo 0 ou lixo } int main() { int x = 10; // Faço um cast para interpretar a memória int como float foo(&x, reinterpret_cast(&x)); return 0; } ``` Espero que após escrever `*a = 42` e `*b = 3.14f` o valor de `*a` seja 42, mas algo estranho é exibido. O compilador (GCC com -O2) se comporta como se minha escrita em `*b` não afetasse `*a`. Ouvi falar sobre a "strict aliasing rule", mas não entendo como essa regra funciona e como contorná-la. Por que o compilador otimiza meu código, quebrando-o? E como fazer reinterpret_cast corretamente entre diferentes tipos?