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

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


> Примечание: ранее данная диагностика была частью другой диагностики – \[V512\]\(https://pvs\-studio\.ru/ru/docs/warnings/v512/\), но позже мы решили разделить их\\\. О причинах и последствиях такого решения можно прочитать в \[специальной заметке\]\(https://pvs\-studio\.ru/ru/blog/posts/cpp/0978/\)\\\.



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

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

Пример N1:

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

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

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

Пример N2:

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

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

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

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

Ранее диагностическое правило было частью другой диагностики – [V512](https://pvs-studio.ru/ru/docs/warnings/v512/)\. В целях обеспечения обратной совместимости осталась возможность отключить данную диагностику с помощью специального комментария:

```cpp
//-V512_UNDERFLOW_OFF
```

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