﻿# V1072\. Buffer needs to be securely cleared on all execution paths\.

Анализатор обнаружил потенциальную ошибку, когда буфер, содержащий приватную информацию, не будет очищен\.

Рассмотрим синтетический пример:

```cpp
int f()
{
  char password[size];
  if (!use1(password))
    return -1;
  use2(password);
  memset_s(password, sizeof(password), 0, sizeof(password));
  return 0;
}
```

Эта ситуация аналогична утечке памяти\. Несмотря на то, что буфер очищается при помощи безопасной функции '[memset\_s](https://en.cppreference.com/w/c/string/byte/memset)', если произойдет выход из функции под условием, данные останутся в памяти\.

Чтобы избежать ошибки, буфер следует очищать на всех путях выполнения\.

Исправленный пример:

```cpp
int f()
{
  char password[size];
  if (use1(password))
  {
    use2(password);
    memset_s(password, sizeof(password), 0, sizeof(password));
    return 0;
  }
  return -1;
}
```

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

Пример:

```cpp
int f()
{
  char password[size];
  if (!use1(password))
    throw Exception{};
  
  RtlSecureZeroMemory(password, size);
  return 0;
}
```

Возможный вариант исправления:

```cpp
int f()
{
  char password[size];
  if (use1(password))
  {
    RtlSecureZeroMemory(password, size);
    return 0;
  }
  throw Exception{};
}
```