Compartilhar via


C6268

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

Este aviso indica que uma expressão de conversão complexo pode envolver um problema de precedência quando realizar aritmética de ponteiro. Porque as conversões de grupo mais perto do que os operadores binários, o resultado pode não 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 de 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 provavelmente será o programador pretendia.

Dependendo dos tamanhos relativos dos dois tipos, isso pode levar à 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 seguinte código:

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