我发现了一些示例代码,如下所示:
addrinfo hints;
SecureZeroMemory(&hints, sizeof(hints));
有理由在这里使用 SecureZeroMemory() 吗?为什么不只是
addrinfo hints = {0};
示例代码: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms742203 (v=vs.85).aspx
我发现了一些示例代码,如下所示:
addrinfo hints;
SecureZeroMemory(&hints, sizeof(hints));
有理由在这里使用 SecureZeroMemory() 吗?为什么不只是
addrinfo hints = {0};
示例代码: http: //msdn.microsoft.com/en-us/library/windows/desktop/ms742203 (v=vs.85).aspx
如果(例如)在当前范围内不再使用该变量(或在编译器证明它不会改变程序内部一致性的任何其他情况下),编译器可以优化调零语句。对于安全关键内存,当涉及到检查您的内存的外部进程时,这可能会损害应用程序的安全性。SecureZeroMemory
被编写以便它不会被优化掉。
我无法确定为什么这个特定的代码片段选择该函数而不是其他归零内存范围的方法。这可能是代码作者对其目的的误解或公司政策的误导。
来自MSDN:
ZeroMemory
当您想要确保您的数据将被及时覆盖时,请使用此函数,因为某些 C++ 编译器可以ZeroMemory
通过完全删除它来优化调用。
此外,一个简单的分配,w/oa 屏障,可能会被硬件缓存,并且不会长时间进入 RAM。或者局部变量可以被优化掉。SecureZeroMemory 确保不会发生这种情况。
至于为什么使用初始化addrinfo
,一个明显与安全无关的问题,打败了我。