# V1086. Call of the 'Foo' function will lead to buffer underflow.

Анализатор обнаружил потенциально возможную ошибку, связанную с заполнением, копированием или сравнением буферов памяти. Ошибка может приводить к неполной обработке буфера (buffer underflow).

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

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

Рассмотрим два примера, взятых из реальных приложений.

Пример N1:

    MD5Context *ctx;
    ....
    memset(ctx, 0, sizeof(ctx));

Здесь из-за опечатки нулями заполняется не вся структура, а только её часть. Ошибка в том, что вычисляется размер указателя, а не структуры 'MD5Context'. Корректный вариант кода:

    MD5Context *ctx;
    ....
    memset(ctx, 0, sizeof(*ctx));

Пример N2:

    #define CONT_MAP_MAX 50
    int _iContMap[CONT_MAP_MAX];
    memset(_iContMap, -1, CONT_MAP_MAX);

В данном примере также неверно указан размер заполняемого буфера. Корректный вариант:

    #define CONT_MAP_MAX 50
    int _iContMap[CONT_MAP_MAX];
    memset(_iContMap, -1, CONT_MAP_MAX * sizeof(int));

## Совместимость с предыдущими версиями

Ранее диагностическое правило было частью другой диагностики – V512. В целях обеспечения обратной совместимости осталась возможность отключить данную диагностику с помощью специального комментария:

    //-V512_UNDERFLOW_OFF

Этот комментарий может быть вписан в заголовочный файл, который включается во все другие файлы. Например, это может быть "stdafx.h". Если вписать этот комментарий в "*.cpp" файл, то он будет действовать только для этого файла.

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

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

CWE-119 CWE-467 CWE-682 CERT-ARR01-C

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