[Windows] メモリをクリアする

UNIX上でbzeroを使用していたソースコードと同じことをWindowsでする方法を探した。ちょっと手間取ったのでまとめ代わりにメモ。 WindowsのランタイムライブラリにはC言語で標準的な関数名がそろっていることが多い。が、bzeroとbcopyはないようだ。 代わりにmemsetがあるので、

memset(p, 0, sizeof(struct dummy));

で代用する方法がある。これはUNIXでも一般的に存在する関数なので、ソースコードを使いまわせる可能性が高い。 ウェブサイトを調べてみると、このmemsetはコンパイラによって最適化される。その結果、実行されない場合があるらしい。これが(その部分にゼロを書き込む必要がある場合には)問題になる場合もあるとのこと。同じ変数を読み書きしていないとコンパイラが判断して関数呼び出しを最適化の一環として消すのだろう。 これではメモリを確実にクリアすることができない。暗号関係の人などだと確実にゼロにしたい、という要求があり、必ず実行される関数が必要になる。そこで、SecureZeroMemoryを使うように推奨されている。

SecureZeroMemory(p, sizeof(struct dummy));

Secureがついていない(コンパイラによって除去される可能性のある)マクロ ZeroMemoryも存在する。

広告
%d人のブロガーが「いいね」をつけました。