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++標準に準拠していますか?