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

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

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

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

Эта ситуация аналогична утечке памяти. Несмотря на то, что буфер очищается при помощи безопасной функции 'memset_s', если произойдет выход из функции под условием, данные останутся в памяти.

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

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

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

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

Пример:

    int f()
    {
      char password[size];
      if (!use1(password))
        throw Exception{};

      RtlSecureZeroMemory(password, size);
      return 0;
    }

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

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

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

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

CWE-212 CERT-MEM03-C