Aviso C6268

Ordem incorreta das operações: ('TYPE1')('TYPE2')x + y. Possíveis parênteses ausentes em ('TYPE1')(('TYPE2')x + y)

Este aviso indica que uma expressão de conversão complexa pode envolver um problema de precedência ao executar aritmética de ponteiro. Como as conversões são agrupadas mais proximamente 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 no programa.

Comentários

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 assim o deslocamento é interpretado como um deslocamento em inteiros. Em outras palavras, equivale a:

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

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

Dependendo dos tamanhos relativos dos dois tipos, esse deslocamento pode levar a uma saturação de buffer.

Nome da análise de código: MISPARENTHESIZED_CASTS

Exemplo

O seguinte código gera esse 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 ...
}