Non, vous mélangez probablement des choses différentes.
règles strictes ont crénelage absolument rien à voir spécifiquement avec la norme C99. Les règles d'alias strictes sont enracinées dans les parties de la norme qui étaient présentes en C et C++ depuis le début des temps [standardisés]. La disposition qui interdit l'accès aux objets d'un type à travers un lvalue d'un autre type est présent en C89/90 (6,3) et en C++ 98 (3,10/15). C'est ce que le strict aliasing signifie, pas plus, pas moins. C'est juste que tous les compilateurs n'ont pas voulu (ou osé) l'imposer ou s'en servir. Les langages C et C++ sont parfois utilisés comme langages d'assemblage de haut niveau et les règles strictes d'alias interfèrent souvent avec ces utilisations. C'est GCC qui a fait ce choix audacieux et a décidé de commencer à s'appuyer sur des règles strictes d'aliasing dans les optimisations, en tirant souvent des plaintes de ces types "d'assemblage".
Il est vrai que la manière la plus directe de casser les règles strictes d'aliasing en C++ est reinterpret_cast
(et la distribution de style C, bien sûr). Cependant, static_cast
peut également être utilisé à cette fin, car elle permet de casser aliasing strict en utilisant void *
comme un type intermédiaire dans une « chaîne » cast
int *pi;
...
double *pd = static_cast<double *>(static_cast<void *>(pi));
const_cast
ne peut pas briser aliasing strict dans un compilateur conforme.
Quant au C99 ... Ce C99 a fait place était le qualificatif restrict
. Ceci est directement lié à l'aliasing, mais ce n'est pas ce que l'on appelle le strict aliasing en soi.
Vous avez raison, je pensais C99 mot-clé 'restrict', plutôt que strict aliasing. Pour une raison ou une autre, il s'est ancré dans mon esprit de cette façon ("C99" + "strict aliasing"). –
Alors, quelle est exactement la clause en question?Cela signifie-t-il que tout code C89/C99/C++ 98 qui enfreint les règles strictes d'aliasing est techniquement incorrect (à l'exception des commutateurs spécifiques au compilateur comme -fno-strict-aliasing)? –
@Checkers: J'ai ajouté les chiffres à ma réponse. Et oui, le code qui brise les règles strictes d'alias présente un comportement indéfini, aussi bien en C89 qu'en C++ 98. – AnT