C6268

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

Este aviso indica que uma expressão de conversão complexa pode envolver um problema de precedência ao realizar aritmética de ponteiro.Porque as projeções de grupo mais perto do que operadores binários, o resultado não pode ser o programador pretendia.Em alguns casos, esse defeito causa um comportamento incorreto ou uma falha no 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 números inteiros.Em outras palavras, é equivalente a:

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

que não é provável que haja o programador pretendia.

Dependendo dos tamanhos relativos dos dois tipos, isso pode causar uma saturação 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 código a seguir:

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