Freigeben über


C6268

Warnung C6268: Falsche Operationsreihenfolge: (<TYP1>)(<TYP2>)x + y. Möglicherweise fehlen Klammern: (<TYPE1>)((<TYPE2>)x + y)

Diese Warnung gibt an, dass bei der Durchführung von Zeigerarithmetik möglicherweise ein Rangfolgenproblem in einem komplexen Umwandlungsausdruck vorliegt. Da Umwandlungen enger gruppiert werden als binäre Operatoren, entspricht das Ergebnis möglicherweise nicht der Absicht des Programmierers. In einigen Fällen verursacht dieser Fehler falsches Verhalten oder einen Programmabsturz.

In einem Ausdruck wie

(char *)p + offset

wird der Offset als Offset in Zeichen interpretiert. Dagegen ist ein Ausdruck wie

(int *)(char *)p + offset

identisch mit folgendem Ausdruck:

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

Deshalb wird der Offset als Offset in ganzen Zahlen interpretiert. Mit anderen Worten, entspricht dieser Ausdruck dem folgenden:

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

Dies entspricht wahrscheinlich nicht der Absicht des Programmierers.

Je nach den relativen Größen der beiden Typen kann dies zu einem Pufferüberlauf führen.

Beispiel

Der folgende Code generiert diese Warnung:

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

So korrigieren Sie die Warnung unter Verwendung des folgenden Codes

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