Предупреждение C6268

Неправильный порядок операций: ('TYPE1')('TYPE2')x + y. Возможные отсутствующие скобки в ('TYPE1')('TYPE2')x + y)

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

Замечания

В выражении, например:

(char *)p + offset

смещение интерпретируется как смещение в символах; Однако выражение, например:

(int *)(char *)p + offset

эквивалентно правилу

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

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

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

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

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

Имя анализа кода: MISPARENTHESIZED_CASTS

Пример

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

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