编译器是否在析构函数中优化memset?

马丁·邦纳(Martin Bonner)支持莫妮卡(Monica)

给定一个像这样的结构:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器是否真的强制执行纯虚拟析构函数?

默认的虚拟析构函数是否会阻止编译器生成的移动操作?

我需要知道编译器如何与 cpp 中的析构函数一起工作

编译器定义了带有析构函数的move构造函数

从std :: streambuf继承时出现不兼容的析构函数编译器警告

C ++编译器是否优化重复的函数调用?

C编译器是否优化汇编中的函数,以使对堆栈的使用最小化?

当析构函数在类主体中声明为unique_ptr作为同一类的成员时发生编译器错误

优化析构函数的大小

QDialogs中是否需要析构函数?

TypeScript中是否有析构函数

析构函数中的析构函数?

编译器可以优化汇编中的函数序言吗?

声明一个空的析构函数可以防止编译器调用memmove()复制连续对象

编译器是否优化变量声明?

虚函数调用的编译器优化

虚拟函数编译器优化C ++

R中的字节编译器优化

在SBCL中检查编译器优化

gcc中的编译器优化

虚拟表中是否包含继承的析构函数?

Java中是否有等效的C ++析构函数?

是否可以清除析构函数中的向量

是否在作业中调用了类析构函数?

C ++中的原始类型是否具有析构函数?

F#编译器是否可以优化这些相互递归的函数?

在连续调用函数的情况下,C编译器是否优化执行堆栈?

是否允许C编译器优化未使用的函数参数?

C++ 编译器是否对齐小函数以优化缓存行提取?