给定一个像这样的结构:
struct CryptoKey {
std::vector<unsigned char> key;
~CryptoKey() { memset(key.data(),0,key.size()); }
};
编译器有权取消对的调用,memset
因为这将节省时间,并且没有定义行为的程序可以分辨出差异。(鉴于key
该析构函数返回后,该变量将不再存在。)
但是,这样的代码在密码学应用程序中很有用,因为将秘密存储在内存中的时间越短,攻击者提取它的机会就越少。(memset
它不提供安全性,但确实提供了“纵深防御”。)
我的问题是,它真正的编译器实际上也消除这样的memset
电话(显然,与优化开启)?
对于优化器来说,这里的问题是您的memset根本没有写入成员。是的,key
将不复存在,但事实并非如此key.data
。该内存将返回到std::allocator
。并且std::allocator
很可能会读取相邻的内存,以确定来自哪个内存块key.data
。典型的实现方式是将这样的数据存储在已分配块的头中,即以负偏移量存储。不太可能更新标头以反映该块是空闲的,或者将该空闲块与其他空闲块合并。
甚至可以内联,所以优化器会先看到一个函数执行a memset
,然后再访问标头。期望优化器找出memset
无害的东西是不合理的。就其所知,分配器可能正在保留一个归零块池。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句