# V1093. The result of the right shift operation will always be 0. The right operand is greater than or equal to the number of bits in the left operand.

Анализатор обнаружил бессмысленное действие: левый операнд побитово сдвигается вправо на такое количество бит, что в результате всегда получает ноль.

Рассмотрим пример:

    void Metazone_Get_Flag(unsigned short* pFlag, int index)
    {
      unsigned char* temp = 0;
      unsigned char flag = 0;

      if (index >= 8 && index < 32)
      {
        temp = (u8*)pFlag;
        flag = (*temp >> index) & 0x01;  // <=
      }
      // ....
    }

Если обратить внимание на условие оператора 'if', то можно увидеть, что значение переменной 'index' будет лежать в диапазоне [8 .. 31]. Под указателем 'temp' лежит значение типа 'unsigned char'. При операции сдвига левый операнд типа 'unsigned char' вследствие integral promotion расширится до 'int', и старшие биты будут заполнены нулевыми значениями. Соответственно, при сдвиге вправо на большее количество бит, чем было в числе до его преобразования, результатом операции будет 0.

Это значит, что приведённый выше код не имеет практического смысла и скорее всего содержит логическую ошибку или опечатку.

Примечание

Подобное предупреждение может выдаваться для макросов, которые раскрыты для краевых/вырожденных случаев. Другими словами, такие макросы не содержат ошибку и 0 будет являться вполне ожидаемым результатом выражения. Если вы пишете подобный код и не хотите, чтобы анализатор выдавал на него срабатывания, то вы можете подавить их при помощи специального комментария, который содержит имя вашего макроса и номер данного диагностического правила:

    //-V:YOUR_MACRO_NAME:1093

Полезные ссылки:

- Подавление ложнопозитивных предупреждений
- Диагностическое правило V610