В этой статье MSND говорится SecureZeroMemory()
хорошо для случаев, когда уязвимые данные, хранившие в памяти некоторое время, должны быть наверняка перезаписаны как можно скорее, когда больше не необходимый. Ответы на это ТАК подвергают сомнению, объясняют, почему это может иметь значение.
Теперь есть ли любой с тех пор в использовании SecureZeroMemory()
для инициализации просто каждого блока памяти? Например, в одном проекте я вижу код как следующее:
ICONINFO ii;
::SecureZeroMemory(&ii, sizeof(ICONINFO));
if (::GetIconInfo(hIcon, &ii))
{
//do stuff, then
//release bitmaps
if(ii.hbmMask)
::DeleteObject(ii.hbmMask);
if(ii.hbmColor)
::DeleteObject(ii.hbmColor);
}
почему использование SecureZeroMemory()
здесь вместо ZeroMemory()
, memset()
или инициализация значения? Я имею в виду, решает ли компилятор, что инициализация является ненужной и хочет оптимизировать его - почему я осуществил бы его? Есть ли любая причина использовать SecureZeroMemory()
здесь?
Нет смысла использовать SecureZeroMemory для инициализации информационной структуры иконки. Она может перезаписать только те байты стека, которые должны были быть надежно стерты в другом месте. Эта лошадь уже сбежала из сарая. Инициализировать его вообще не имеет смысла, возвращаемое значение GetIconInfo() говорит о том, что он инициализировался.
SecureZeroMemory() имеет смысл только после заполнения памяти безопасными данными.
SecureZeroMemory - это никогда не оптимизируется компилятором. Это важно, если вам нужно беспокоиться о содержимом вашей памяти, которое нужно очистить, скажем, если она содержит очень чувствительную информацию о пользователе, например, банковское программное обеспечение, пароли и т.д. Очевидно, что если вам не нужно беспокоиться о таких вещах, вы можете использовать любой другой способ очистки буферов памяти или не очищать их вообще, если в этом нет необходимости.