# 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'.

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

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

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

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

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

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

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

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

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

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