﻿# V1113\. Potential resource leak\. Calling the 'memset' function will change the pointer itself, not the allocated resource\. Check the first and third arguments\.

Анализатор обнаружил подозрительный код: в функцию 'memset' передаётся адрес указателя, который ссылается на динамически выделенную память\. Такой код может привести к утечке памяти после использования функции 'memset'\.

Рассмотрим следующую ситуацию\. Допустим, что в проекте существовал следующий корректно работающий код:

```cpp
void foo()
{
  constexpr size_t count = ....;
  char array[count];

  memset(&array, 0, sizeof(array));
  ....
}
```

На стеке создаётся массив, а затем его содержимое зануляется при помощи функции 'memset'\. В исходном примере нет ошибок: первым аргументом передаётся адрес массива, а третьим аргументом – реальный размер массива в байтах\.

Чуть позже программист по каким\-либо причинам заменил аллокацию буфера со стека на кучу: 

```cpp
void foo()
{
  constexpr size_t count = ....;
  char *array = (char*) malloc(count * sizeof(char));
  ....
  memset(&array, 0, sizeof(array));     // <=
  ....
}
```

При этом он не изменил вызов функции 'memset'\. Это означает, что теперь первым аргументом передаётся адрес указателя на стеке функции, а третьим аргументом — его размер\. Это приводит к занулению указателя вместо содержимого массива и утечке памяти\.

Пример исправленного кода:

```cpp
void PointerFixed()
{
  ....
  constexpr size_t count = ....;
  char *array = (char*) malloc(count * sizeof(char));
  ....
  memset(array, 0, count * sizeof(char));
  ....
}
```

Теперь первым параметром передаётся адрес участка памяти на куче, а третьим параметром — его размер\.