Анализатор обнаружил потенциальную ошибку, когда буфер, содержащий приватную информацию, не будет очищен.
Рассмотрим синтетический пример:
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{}; }
Данная диагностика классифицируется как:
|