Поделиться через


C6268

Обновлен: Ноябрь 2007

C6268

Предупреждение C6268. Некорректный порядок операций: (<TYPE1>)(<TYPE2>)x + y. Возможно, пропущены круглые скобки в (<TYPE1>)((<TYPE2>)x + y)

Данное предупреждение означает, что при выполнении арифметических операций с указателями могла возникнуть проблема порядка вычислений в сложном выражении приведения. Поскольку приведения группируются раньше двоичных операторов, результат может не совпадать с намерениями программиста. В некоторых случая подобная проблема приводит к неверному поведению или сбою программы.

В таких выражениях, как:

(char *)p + offset

offset интерпретируется как сдвиг знака; однако следующее выражение:

(int *)(char *)p + offset

эквивалентно выражению:

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

и поэтому здесь offset интерпретируется как сдвиг целых чисел. Другими словами, это выражение эквивалентно следующему:

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

что, скорее всего, не соответствует намерениям программиста.

В зависимости от относительных размеров двух типов, это может привести к переполнению буфера.

Пример

Данное предупреждение создается в следующем коде:

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

Для устранения этого предупреждения используйте следующий код:

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