>
>
>
V3176. The '&=' or '|=' operator is red…


V3176. The '&=' or '|=' operator is redundant because the right operand is always true/false.

Анализатор обнаружил фрагмент кода, в котором правый операнд оператора '&=' или '|=' всегда имеет одно и то же значение.

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

void Foo(bool status)
{
  ....
  bool currentStatus = ....;
  ....
  if(status)
    currentStatus &= status;
  ....
}

В блоке 'then' конструкции 'if' выполняется операция составного присваивания. Переменная 'currentStatus' примет значение, равное результату логической операции 'currentStatus & status'. Исходя из условия, 'status' всегда будет 'true', что делает бессмысленным использование оператора '&=', ведь после выполнения присваивания значение 'currentStatus' не изменится.

Если же правый операнд всегда равен 'false', использование оператора '&=' также является бессмысленным. В таких случаях он может быть заменён на обычное присваивание.

Использование оператора '|=' также не имеет смысла, если его правый операнд всегда имеет одно и то же значение:

  • если этим значением будет 'false', то значения операндов останутся неизменными;
  • если значение всегда равно 'true', то оно и будет присвоено левому операнду независимо от его изначального значения.

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

Например, корректный вариант вышеописанного метода может выглядеть следующим образом:

void Foo(bool status)
{
  ....
  bool currentStatus = ....;
  ....
  if(status)
    currentStatus = status;
  ....
}

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