Avatar ·

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 ?