C6268C6268

предупреждение C6268: неверный порядок операций: ( <TYPE1> ) ( <TYPE2> ) x + y.warning C6268: Incorrect order of operations: (<TYPE1>)(<TYPE2>)x + y. Возможные пропущенные круглые скобки в ( <TYPE1> ) (( <TYPE2> ) x + y)Possible missing parentheses in (<TYPE1>)((<TYPE2>)x + y)

Это предупреждение означает, что сложное выражение приведения может содержать задачу приоритета при выполнении арифметических операций с указателями.This warning indicates that a complex cast expression might involve a precedence problem when performing pointer arithmetic. Поскольку приведения группируются более тесно, чем бинарные операторы, результат может быть не так, как задумано программистом.Because casts group more closely than binary operators, the result might not be what the programmer intended. В некоторых случаях этот дефект приводит к неправильному поведению или сбою программы.In some cases, this defect causes incorrect behavior or a program crash.

В выражении, например:In an expression such as:

(char *)p + offset

смещение интерпретируется как смещение в символах; Однако выражение, например:the offset is interpreted as an offset in characters; however, an expression such as:

(int *)(char *)p + offset

эквивалентно правилуis equivalent to:

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

и поэтому смещение интерпретируется как смещение в целых числах.and so the offset is interpreted as an offset in integers. Иными словами, это эквивалентно следующему:In other words, it is equivalent to:

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

что, скорее всего, не будет назначено программисту.which is not likely to be what the programmer intended.

В зависимости от относительного размера двух типов это может привести к переполнению буфера.Depending on the relative sizes of the two types, this can lead to a buffer overrun.

ПримерExample

Это предупреждение создается в следующем коде:The following code generates this warning:

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

Чтобы исправить это предупреждение, используйте следующий код:To correct this warning, use the following code:

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