Condividi tramite


C6268

Aggiornamento: novembre 2007

C6268

avviso C6268: ordine errato delle operazioni: (<TIPO1>)(<TIPO2>)x + y. È possibile che manchino le parentesi in (<TIPO1>)((<TIPO2>)x + y)

L'avviso indica che un'espressione di cast complessa può determinare un problema di precedenza nell'esecuzione dell'aritmetica dei puntatori. Dal momento che i cast vengono raggruppati più vicini degli operatori binari, il risultato potrebbe non rispecchiare lo scopo del programmatore. In alcuni casi l'errore provoca un comportamento non corretto o un arresto anomalo del programma.

In un'espressione come:

(char *)p + offset

l'offset viene interpretato come un offset nei caratteri, mentre un'espressione come:

(int *)(char *)p + offset

equivale a:

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

pertanto l'offset viene interpretato come un offset negli integer. In altre parole equivale a:

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

che probabilmente non corrisponde alle intenzioni del programmatore.

In base alle dimensioni relative dei due tipi, questa situazione può portare a un sovraccarico del buffer.

Esempio

Il codice seguente genera questo avviso:

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

Per risolvere il problema, utilizzare il codice seguente:

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