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 ...
}