C6268

avertissement C6268 : ordre des opérations incorrect : (< TYPE1 >) (< TYPE2 >) X + Y. Les parenthèses dans (< TYPE1 >) ((< TYPE2 >) x + y) peuvent être manquantes

Cet avertissement indique qu'une expression de cast complexe peut impliquer un problème de priorité lors de l'exécution des opérations arithmétiques sur les pointeurs. Étant donné que les casts sont regroupés plus étroitement que les opérateurs binaires, il est possible que le résultat ne corresponde pas à celui prévu par le programmeur. Dans certains cas, ce défaut provoque un comportement incorrect ou un blocage du programme.

Dans une expression telle que :

(char *)p + offset

l'offset est interprété comme un offset dans les caractères ; toutefois, une expression telle que :

(int *)(char *)p + offset

équivaut à :

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

et l'offset est donc interprété comme un offset dans les entiers. En d'autres termes, il est équivalent à :

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

ce qui ne correspond probablement pas au résultat prévu par le programmeur.

Selon les tailles relatives des deux types, cela peut générer un dépassement de mémoire tampon.

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 ...
}