これは基本的にこの質問の続きです。これまでのところ、次のような関数がある場合は次のようになります。
void SecureZeroMemory( void* ptr, size_t cnt )
{
volatile char *vptr = (volatile char *)ptr;
while (cnt) {
*vptr = 0;
vptr++;
cnt--;
}
}
次のように呼び出します。
{
char buffer[size];
SecureZeroMemory( buffer, size );
}
volatile と宣言されてbuffer
いないため、volatile へのポインタが使用されても問題ありません。データ自体は volatile ではないため、変数への書き込みは観察可能な動作 (1.9/6) を構成せず、コンパイラはそれらを最適化することができます。 .
しかし最近、重要なのはポインター宣言だけだという声明に出くわしました。具体的には、C++03 5.3.1/1 は次のようにインダイレクション (*) を記述します。
単項 * 演算子は間接参照を実行します [...] 式の型が「T へのポインター」の場合、結果の型は「T」です。</p>
つまり、avolatile char*
で間接参照を使用しているため、それらへの getvolatile char
および write は観察可能な動作を構成し、実際のデータがどのように宣言されているかはもはや重要ではありません。
C++03 5.3.1/1 のインダイレクションの記述はvolatile T*
、上記のサンプルのようにポインタを使用してメモリを上書きすることは、監視可能な動作を構成し、最適化されないようにすることを本当に保証していますか?