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;
....
}
Данная диагностика классифицируется как: