允许 C++ 编译器优化写入内存:
{
//all this code can be eliminated
char buffer[size];
std::fill_n( buffer, size, 0);
}
在处理敏感数据时,典型的方法是使用volatile*
指针来确保编译器发出内存写入。下面是SecureZeroMemory()
Visual C++ 运行时库 (WinNT.h) 中函数的实现方式:
FORCEINLINE PVOID RtlSecureZeroMemory(
__in_bcount(cnt) PVOID ptr, __in SIZE_T cnt )
{
volatile char *vptr = (volatile char *)ptr;
#if defined(_M_AMD64)
__stosb((PBYTE )((DWORD64)vptr), 0, cnt);
#else
while (cnt) {
*vptr = 0;
vptr++;
cnt--;
}
#endif
return ptr;
}
该函数将传递的指针转换为一个volatile*
指针,然后通过后者写入。但是,如果我在局部变量上使用它:
char buffer[size];
SecureZeroMemory( buffer, size );
变量本身不是volatile
。因此,根据可观察行为的 C++ 标准定义,写入buffer
不计为可观察行为,并且看起来可以对其进行优化。
现在下面有很多关于页面文件,缓存等的评论,这些评论都是有效的,但是我们在这个问题中忽略它们。这个问题的唯一问题是内存写入的代码是否被优化掉了。
是否可以确保不会在 C++ 中优化写入内存的代码?解决方案SecureZeroMemory()
是否符合 C++ 标准?