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?