gpt4 book ai didi

c++ - 编译器会在析构函数中优化 memset 吗?

转载 作者:太空狗 更新时间:2023-10-29 20:02:23 28 4
gpt4 key购买 nike

给定如下结构:

struct CryptoKey {
std::vector<unsigned char> key;
~CryptoKey() { memset(key.data(),0,key.size()); }
};

编译器有权消除对memset 的调用,因为这样可以节省时间,而且具有已定义行为的程序都无法区分。 (鉴于一旦析构函数返回,变量 key 将不复存在。)

不过,像这样的代码在加密应用程序中很有用,因为 secret 存储在内存中的时间越短,攻击者提取它的机会就越少。 (memset 不提供安全性,但它确实提供“纵深防御”。)

我的问题是,哪些真正的编译器实际上消除了这样的memset调用(显然,打开了优化)?

最佳答案

也许更好的说法是,一个好的编译器会尝试消除 memset 调用,开发人员不应依赖编译器实现的差异来避免这种优化。这些编译器通常具有不会被优化的安全替代方案。

memset 的安全版本

C11引入了memset_s,其中一个特点就是不会被优化掉。

Unlike memset, any call to the memset_s function shall be evaluated strictly according to the rules of the abstract machine as described in (5.1.2.3). That is, any call to the memset_s function shall assume that the memory indicated by s and n may be accessible in the future and thus must contain the values indicated by c.

特定于 Windows

在 Windows 上还有其他选择。 SecureZeroMemory 或使用 #pragma optimize 编译指示关闭优化。

通用子表达式优化

密码安全性存在一个更广泛的问题:出于优化原因,编译器有权复制缓冲区。归零可能不会删除所有拷贝,编译器可能已经应用优化将堆复制到堆栈以消除公共(public)子表达式。因此,除了避免优化归零外,还应注意编译器不会插入额外的拷贝。

关于c++ - 编译器会在析构函数中优化 memset 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502725/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com