所以我真的很感兴趣它是否能够在GCC和clang采用的激进优化策略中存活下来。
考虑以下示例:
void* clean(void* pointer, std::size_t size) noexcept
{
return new(pointer) char[size]{};
}
void doStuff()
{
//...
clean(pointer, size);
//...
}
我可以信任它来清理敏感数据吗?
答案 0 :(得分:2)
我不认为优化可以在这里发挥任何技巧。在这种情况下,标准强制执行值初始化:new(pointer) char[size]{}
,因此在pointer
指向的调用内存之后将填充0。
如果您从未访问新指针或在访问之前覆盖它(基于可观察性),编译器可以优化它。如果您想避免这种可能性,则需要将指针定义为指向volatile
的指针。
答案 1 :(得分:2)
我不确定这是您的问题的答案还是只是旁注但您可以使用optimize()
编译器指令
void* __attribute__((optimize("O0"))) clean(void* pointer, std::size_t size) {
// unmodifiable compiler code
}
这将确保您的clean()函数不会被优化