# V6034. Shift by N bits is inconsistent with the size of type.

Анализатор обнаружил потенциальную ошибку, связанную со сдвигом целого числа на 'N' бит, при этом 'N' больше размера этого числового типа в битах.

Давайте рассмотрим пример:

    long convert(int x, int y, int shift)
    {
      if (shift < 0 || shift > 32) {
        return -1;
      }
      return (x << shift) + y;
    }

В данном случае хотели собрать 64-битное число из 2-х 32-битных, сдвинув 'x' на некоторое количество бит 'shift' и сложив старшую и младшую части. Есть вероятность того, что 'shift' может иметь значение равное 32. Поскольку 'x' в момент сдвига является 32-битным числом, то сдвиг на 32 бита эквивалентен сдвигу на 0 бит, что приведет к некорректному результату.

Корректный вариант может выглядеть так:

    long convert(int x, int y, int shift)
    {
      if (shift < 0 || shift > 32) {
        return -1;
      }
      return ((long)x << shift) + y;
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.

Данная диагностика классифицируется как:

CWE-758 CERT-NUM14-J

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6034.