Udostępnij za pośrednictwem


C6268

Ostrzeżenie C6268: nieprawidłowa kolejność operacji: (<TYPE1>)(<TYPE2>) x + y.Możliwe brakujące nawiasy w (<TYPE1>) ((<TYPE2>) x + y)

To ostrzeżenie wskazuje wyrażeniem rzutowania złożone mogące stwarzać problemu pierwszeństwo podczas operacje arytmetyczne wskaźnik.Ponieważ poświaty grupy ściślej niż operatory dwuargumentowe, wynik może nie być przeznaczone programista.W niektórych przypadkach tej wady powoduje nieprawidłowe zachowanie lub awarii programu.

W wyrażeniu, takim jak:

(char *)p + offset

Przesunięcie jest interpretowana jako przesunięcie w znakach; Jednak wyrażenie, takie jak:

(int *)(char *)p + offset

jest równa:

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

i tak przesunięcie jest interpretowana jako przesunięcie w liczb całkowitych.Innymi słowy jest równoważne:

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

która nie jest prawdopodobnie programista przeznaczone.

W zależności od względnej wielkości dwóch typów może to prowadzić do przepełnienia buforu.

Przykład

Poniższy kod generuje ostrzeżenie to:

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

Aby poprawić to ostrzeżenie, należy użyć następującego kodu:

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