什么时候应该使用SecureZeroMemory()?

时间:2013-09-22 12:54:10

标签: c++

我找到了一些示例代码:

addrinfo hints;
SecureZeroMemory(&hints, sizeof(hints));

有理由在这里使用SecureZeroMemory()吗?为什么不呢

addrinfo hints = {0};

示例代码: http://msdn.microsoft.com/en-us/library/windows/desktop/ms742203(v=vs.85).aspx

2 个答案:

答案 0 :(得分:8)

如果(例如)变量在本范围内不再使用(或者在编译器证明它不会改变程序内部一致性的任何其他情况下),编译器可以优化掉零声明。对于安全关键型内存,当涉及到检查您内存的外部进程时,这可能会危及应用程序的安全性。编写SecureZeroMemory以便不会对其进行优化。

我无法确定为什么这个特定的代码片段会选择该函数而不是其他归零内存范围的方法。这可能是代码作者或误入歧途的公司政策对其目的的误解。

答案 1 :(得分:6)

来自MSDN

  

当您想要确保及时覆盖您的数据时,请使用此函数而不是ZeroMemory,因为某些C ++编译器可以通过完全删除它来优化对ZeroMemory的调用。

此外,没有屏障的简单分配可能会被硬件高速缓存,而不能长时间进入RAM。或者可以优化局部变量。 SecureZeroMemory确保不会发生这种情况。

至于为什么用于初始化addrinfo,一个明显不与安全相关的问题,打败了我。