这基本上是这个问题的延续。到目前为止,如果我有这样的功能,它看起来像这样:
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 );
}
那么由于buffer
没有声明为 volatile 使用指向 volatile 的指针并不重要 - 数据本身不是 volatile,因此写入变量不构成可观察的行为(1.9/6),并且允许编译器优化它们.
但是最近我遇到了一个声明,即只有指针声明才重要。特别是 C++03 5.3.1/1 描述了这样的间接(*):
一元 * 运算符执行间接 [...] 如果表达式的类型是“指向 T 的指针”,则结果的类型是“T”。</p>
因此,声称是因为在volatile char*
我们获取volatile char
和写入的 a 上使用了间接性,它们确实构成了可观察的行为,并且如何声明实际数据不再重要。
C++03 5.3.1/1 对间接的描述是否真的保证使用volatile T*
上面示例中的指针覆盖内存构成可观察的行为并且不允许被优化掉?