Question

Compte tenu de ce code, VC9 ne détecte pas aliasing:

typedef struct { int x, y; } vec_t;

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        /* Notice x depends on y and vice versa */
        to->x = from->y;
        to->y = -from->x;
}

/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */

La solution évidente est d'utiliser un temporaire:

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        int temp = from->x;
        to->x = from->y;
        to->y = -temp;
}

Est-ce comportement standard? Je me attendais à ce que le compilateur, à moins qu'on me le dise, assumerait les pointeurs à éventuellement aliasées.

Était-ce utile?

La solution

Consultez cette réponse .

Essayez de mettre __restrict avant que les paramètres , semble être la seule personne de façon trouvé d'obtenir MSVC pour donner des avertissements.

Autres conseils

Le code tel qu'il est écrit est parfaitement valide, en C89 ou C99. Il est obscur, mais il n'y a rien pour le compilateur à diagnostiquer, il ne permet pas de diagnostiquer.

Si vous avez utilisé C99 et « restreindre » sur les deux paramètres de la fonction, vous obtiendrez une erreur - si votre compilateur prend en charge C99. Autant que je sache, aucune version actuelle de MSVC soutient encore C99 pleinement.

Avant C99 a inventé le qualificatif de restrict, certains compilateurs C inclus des options d'optimisation qui les dirigent à faire certaines hypothèses sur l'utilisation du pointeur; les manuels que je l'ai vu pour ces compilateurs expressément averti que de telles optimisations pas conforme aux normes et peuvent arbitrairement causer code en utilisant certaines constructions particulières dont le comportement a été défini par la norme à se comporter d'une manière qui était contrairement à la fois la norme et l'intention de programmeur. Du point de vue du manuel, les optimisations ont dit au compilateur de compiler un sous-ensemble de C qui ne définit pas le comportement de certains cas d'angle qui ont été définis dans C, mais qui permettrait à la génération de code plus efficace pour les cas ne définissaient.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top