C6268

aviso C6268: ordem incorreta de operações: (<TYPE1>)(<TYPE2>)x + y. Possíveis parênteses ausentes em (<TYPE1>)((<TYPE2>)x + y)

Esse aviso indica que uma expressão de cast complexa pode envolver um problema de precedência ao executar aritmética de ponteiro. Como as casts agrupam mais de perto do que os operadores binários, o resultado pode não ser o que o programador pretendia. Em alguns casos, esse defeito causa um comportamento incorreto ou uma falha do programa.

Em uma expressão como:

(char *)p + offset

o deslocamento é interpretado como um deslocamento em caracteres; no entanto, uma expressão como:

(int *)(char *)p + offset

é equivalente a:

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

e, portanto, o deslocamento é interpretado como um deslocamento em inteiros. Em outras palavras, é equivalente a:

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

que provavelmente não é o que o programador pretendia.

Dependendo dos tamanhos relativos dos dois tipos, isso pode levar a um estouro de buffer.

Exemplo

O código a seguir gera este aviso:

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

Para corrigir esse aviso, use o seguinte código:

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