Qu'est-ce que la règle de strict aliasing en C++ et comment casse-t-elle le code ?
Bonjour à tous. Je code en C++ depuis environ un an, et récemment j'ai rencontré un problème étrange. J'ai une fonction qui prend deux pointeurs de types différents, et je m'attends à ce qu'elle modifie une valeur via un pointeur, puis la lise via l'autre. Voici un exemple simplifié :
```cpp
#include
void foo(int* a, float* b) {
*a = 42;
*b = 3.14f;
std::cout << *a; // j'attends 42, mais j'obtiens 0 ou du garbage
}
int main() {
int x = 10;
// Je fais un cast pour interpréter la mémoire int comme float
foo(&x, reinterpret_cast(&x));
return 0;
}
```
Je m'attends à ce qu'après l'écriture de `*a = 42` et `*b = 3.14f`, la valeur de `*a` soit 42, mais quelque chose d'étrange s'affiche. Le compilateur (GCC avec -O2) se comporte comme si mon écriture dans `*b` n'affectait pas `*a`. J'ai entendu parler de la "strict aliasing rule", mais je ne comprends pas comment cette règle fonctionne exactement et comment la contourner. Pourquoi le compilateur optimise-t-il mon code en le cassant ? Et comment faire correctement un reinterpret_cast entre différents types ?
No answers yet.
Connectez-vous pour laisser une réponse
Blogs