Avertissement C6268

Ordre incorrect des opérations : ('TYPE1')('TYPE2')x + y. Parenthèses manquantes possibles dans ('TYPE1')(('TYPE2')x + y)

Cet avertissement indique qu’une expression de cast complexe peut impliquer un problème de précédence lors de l’arithmétique du pointeur. Étant donné que les casts regroupent plus étroitement que les opérateurs binaires, le résultat peut ne pas être ce que le programmeur a prévu. Dans certains cas, ce défaut provoque un comportement incorrect ou un blocage du programme.

Notes

Dans une expression telle que :

(char *)p + offset

le décalage est interprété comme un décalage en caractères ; toutefois, une expression telle que :

(int *)(char *)p + offset

équivaut à :

((int *)(char *)p) + offset

et donc le décalage est interprété comme un décalage dans les entiers. En d’autres termes, il est équivalent à :

(int *)((char *)p + (offset * sizeof(int)))

ce qui n’est probablement pas ce que le programmeur a prévu.

Selon les tailles relatives des deux types, ce décalage peut entraîner un dépassement de mémoire tampon.

Nom de l’analyse du code : MISPARENTHESIZED_CASTS

Exemple

Le code suivant génère cet avertissement :

void f(int *p, int offset_in_bytes)
{
    int *ptr;
    ptr = (int *)(char *)p + offset_in_bytes;
    // code ...
}

Pour corriger cet avertissement, utilisez le code suivant :

void f(int *p, int offset_in_bytes)
{
    int *ptr;
    ptr = (int *)((char *)p + offset_in_bytes);
    // code ...
}