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