Condividi tramite


Avviso C6268

Ordine errato delle operazioni: ('TYPE1')('TYPE2')x + y. Possibili parentesi mancanti in ('TYPE1')(('TYPE2')x + y)

Questo avviso indica che un'espressione cast complessa potrebbe comportare un problema di precedenza durante l'esecuzione dell'aritmetica del puntatore. Poiché esegue il cast di gruppi più strettamente rispetto agli operatori binari, il risultato potrebbe non essere quello previsto dal programmatore. In alcuni casi, questo difetto causa un comportamento errato o un arresto anomalo del programma.

Osservazioni:

In un'espressione, ad esempio:

(char *)p + offset

l'offset viene interpretato come offset in caratteri; Tuttavia, un'espressione come:

(int *)(char *)p + offset

Equivale a:

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

e quindi l'offset viene interpretato come offset in interi. In altre parole, equivale a:

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

che non è probabile che sia ciò che il programmatore intendeva.

A seconda delle dimensioni relative dei due tipi, questo offset può causare un sovraccarico del buffer.

Nome dell'analisi del codice: MISPARENTHESIZED_CASTS

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 correggere questo avviso, usare il codice seguente:

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