V784. The size of the bit mask is less than the size of the first operand. This will cause the loss of higher bits.


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

Рассмотрим несколько примеров, для которых анализатор выдает данное диагностическое сообщение:

unsigned long long x;
unsigned y;
....
x &= ~y;

Посмотрим подробнее, что происходит с битами после каждой операции на примере выражения:

x = 0xffff'ffff'ffff'ffff;
y = 0xff;
x &= ~y;
Picture 3

Как правило это не тот результат, который планировал получить программист:

0xffff’ffff’ffff’ff00 – ожидалось
0x0000’0000’ffff’ff00 – получилось

Код можно поправить, явно приведя переменную 'y' к типу, которая имеет переменная'x':

x &= ~(unsigned long long)y;

В данном случае, сначала произойдёт преобразование типов, а потом отрицание. После операции все старшие биты будут равны единице. Рассмотрим, как изменится пример выше при данном порядке вычислений:

Picture 4

Анализатор также предупреждает о таком коде:

unsigned long long x;
unsigned y;
....
x &= y;

Несмотря на то, что здесь не используются дополнительные операции, этот код всё равно выглядит подозрительно. Лучше явно преобразовать типы, дабы поведение было более очевидным, как для анализатора, так и для ваших коллег.

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V784.


Найденные ошибки

Проверено проектов
346
Собрано ошибок
13 188

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;