This MSND article说,SecureZeroMemory()对于在内存中存储了一段时间的敏感数据时应确保在不再需要时尽快将其覆盖的情况非常有用。对this SO question的回答说明了为什么可以有所作为。

现在,使用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()才有意义。

09-16 12:47