# 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;
      ....
    }

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

CWE-570 CWE-571