c++ - 当安全不是问题时,有什么理由使用 SecureZeroMemory() 而不是 memset() 或 ZeroMemory() 吗?

标签 c++ windows language-agnostic visual-c++ initialization

This MSND articleSecureZeroMemory() 适用于在内存中存储了一段时间的敏感数据应该确保在不再需要时尽快覆盖的情况。 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 从不被编译器优化掉。如果您需要担心要清理的内存内容,那么这一点很重要,比如它是否包含非常敏感的用户信息,例如银行软件、密码等。显然,如果您不需要担心这些事情,您可以使用任何其他方式清理内存缓冲区,或者如果没有必要则根本不清理。

关于c++ - 当安全不是问题时,有什么理由使用 SecureZeroMemory() 而不是 memset() 或 ZeroMemory() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2012602/

相关文章:

c++ - 使用 float 时避免不稳定的小数字

c++ - 我的回溯代码中的错误 - Bridge Crossing

c# - UWP Raspberry Pi 网络服务器问题

cmd.exe(批处理)脚本中的数组、链表等数据结构

forms - csrf token 和验证码都需要吗?

language-agnostic - 如何为包含大量代码的同事做演示?

c++ - 软件产品定价/成本估算

c++ - 从 C/C++ 中的 64 位值中获取 32 位字而不用担心字节序

windows - Win32 API - 当前窗口到仅消息窗口并返回到原始窗口

language-agnostic - 从 Outlook 2007 中提取自动完成电子邮件