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

The analyzer has detected a code fragment that probably contains a logical error. In a conditional expression, the logical literal stands between '??' and another operator with a higher priority.

The '??' operator has a lower priority than '||', '&&', '|', '^', '&', '!=', '==' operators. If we do not use parentheses that define the evaluation of conditions, we may get an error similar to the one below:

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

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

Since the '??' operator has a lower priority than '||', the 'true || GetNextCheck()' expression will be evaluated first. It always returns 'true', while the 'GetNextCheck' method has no effect on the result.

In this case, we can solve the problem by using parentheses for the first part of the expression:

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

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

In the corrected version of the condition, the 'item?.flag ?? true' expression is first evaluated. Only then the '||' operator is evaluated.

This diagnostic is classified as:

CWE-783

You can look at examples of errors detected by the V3177 diagnostic.