# V3177. Logical literal belongs to second operator with a higher priority. It is possible literal was intended to belong to '??' operator instead.

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

Оператор '??' имеет приоритет ниже, чем операторы '||', '&&', '|', '^', '&', '!=', '=='. В случае отсутствия скобок, определяющих порядок проверки условия, может возникнуть ошибка, подобная приведенной ниже:

    class Item
    {
      ....
      public bool flag;
      ....
    }

    void CheckItem(Item? item)
    {
      if (item?.flag ?? true || GetNextCheck(item))
      {
        ....
      }
      return;
    }

Так как приоритет оператора '??' ниже чем '||', в первую очередь будет выполнена проверка выражения 'true || GetNextCheck()', которая всегда возвращает 'true', при этом метод 'GetNextCheck' никак не влияет на полученный результат.

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

    class Item
    {
      ....
      public bool flag;
      ....
    }

    void CheckItem(Item? item)
    {
      if ((item?.flag ?? true) || GetNextCheck(item))
      {
        ....
      }
      return;
    }

В исправленном варианте условия сначала выполнится выражение 'item?.flag ?? true', и только потом отработает оператор '||'.

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

CWE-783

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