Анализатор обнаружил фрагмент кода, который, возможно, содержит логическую ошибку. В условном выражении логический литерал находится между '??' и другим оператором с более высоким приоритетом.
Оператор '??' имеет приоритет ниже, чем операторы '||', '&&', '|', '^', '&', '!=', '=='. В случае отсутствия скобок, определяющих порядок проверки условия, может возникнуть ошибка, подобная приведенной ниже:
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', и только потом отработает оператор '||'.
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3177. |