# V1104. Priority of the 'M' operator is higher than that of the 'N' operator. Possible missing parentheses.

Анализатор обнаружил потенциальную ошибку, связанную с тем, что приоритет операций побитового сдвига выше, чем приоритет побитовых операций '&', '|' и '^'. В результате выражение может давать совсем не тот результат, на который рассчитывал программист.

Рассмотрим пример некорректного кода:

    unsigned char foo(unsigned char byte2, unsigned char disp)
    {
      disp |= byte2 & 0b10000000 >> 6;
      return disp;
    }

Согласно правилам приоритета операций в языках C и C++, выражение будет вычисляться следующим образом:

    ( disp |= ( byte2 & ( 0b10000000 >> 6 ) ) )

Побитовый сдвиг вправо маски '0b10000000' в этом случае выглядит подозрительно. Скорее всего, программист ожидал, что результат побитового "И" будет сдвинут на 6.

Корректный вариант:

    unsigned char f(unsigned char byte2, unsigned char disp)
    {
      disp |= (byte2 & 0b10000000) >> 6;
      return disp;
    }

Общая рекомендация: если в сложном выражении не понятен приоритет операций, то лучше обернуть часть выражения в скобки (CERT EXP00-C, ES.41 CppCoreGuidelines). Даже если скобки окажутся лишними, это нестрашно. Код станет более простым для понимания и будет меньше подвержен ошибкам.

Если вы считаете, что срабатывание ложное, то можно либо подавить его при помощи комментария '//-V1104', либо обернуть в скобки выражение:

    // first option
    disp |= byte2 & 0b10000000 >> 6; //-V1104
    // second option
    disp |= byte2 & (0b10000000 >> 6);

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

CWE-783 CERT-EXP00-C