Advertencia C6268

Orden incorrecto de las operaciones: ('TYPE1')('TYPE2')x + y. Posibles paréntesis que faltan en ('TYPE1')(('TYPE2')x + y)

Esta advertencia indica que una expresión de conversión compleja podría suponer un problema de precedencia al realizar aritmética de puntero. Dado que las conversiones agrupan más estrechamente que los operadores binarios, el resultado podría no ser lo que el programador pretendía. En algunos casos, este defecto provoca un comportamiento incorrecto o un bloqueo del programa.

Comentarios

En una expresión como:

(char *)p + offset

el desplazamiento se interpreta como un desplazamiento en caracteres; sin embargo, una expresión como:

(int *)(char *)p + offset

equivale a:

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

y por lo tanto, el desplazamiento se interpreta como un desplazamiento en enteros. En otras palabras, es equivalente a:

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

que no es probable que sea lo que el programador pretendía.

Dependiendo de los tamaños relativos de los dos tipos, este desplazamiento puede provocar una saturación del búfer.

Nombre del análisis de código: MISPARENTHESIZED_CASTS

Ejemplo

El código siguiente genera esta advertencia:

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

Para corregir esta advertencia, utilice el código siguiente:

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