# V3060. A value of variable is not modified. Consider inspecting the expression. It is possible that other value should be present instead of '0'.

Анализатор обнаружил подозрительное битовое выражение. Выражение написано для того, чтобы изменить определённые биты в переменной. Но значение переменной останется прежним.

Пример подозрительного кода:

    A &= ~(0 << Y);
    A = A & ~(0 << Y);

Программист планировал сбросить определенный бит в переменной, но допустил ошибку. написав 0, вместо 1.

Обе строки идентичны по результату, поэтому рассмотрим вторую строку, как более наглядный пример. Предположим, что имеется следующие значение переменных в битовом представлении:

A = 0..0101

A = 0..0101 & ~(0..0000 << 0..00001)

Сдвиг влево на один бит значения 0 - ни к чему не приведет. В итоге получится следующие выражение:

A = 0..0101 & ~0..0000

Далее будет выполнена операции побитового отрицания, что приведет к следующему выражению:

A = 0..0101 & 11111111

После операции побитового "и", получится, что исходное и результирующее выражение равны:

A = 0..0101

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

    A &= ~(1 << Y);
    A = A & ~(1 << Y);

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

CWE-682