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

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

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

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

    x &= ~(unsigned long long)y;

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

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

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

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

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел.

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

CWE-197 CERT-INT31-C

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