【问题标题】:Does memory allocated on the stack get cleared out when freed?堆栈上分配的内存在释放时是否会被清除?
【发布时间】:2021-08-30 18:44:26
【问题描述】:

如果我们像这样在栈上分配内存:

void foobar()
{
    int arr[10];
}

foobar() 退出后,对该内存块 (arr) 的引用丢失。但它归零了吗?

【问题讨论】:

  • “但它是否设置为零?”
  • 这实际上并不重要,因为任何访问该内存的尝试都是未定义行为,导致您的程序完全不正确并且能够执行任何操作
  • 符合标准的程序如何判断它是否符合标准?
  • 一般经验法则:C++ 不会花时间做你没有明确要求的事情。
  • 如果您想知道 arr 可能包含敏感数据并且您希望它被覆盖,这超出了标准 C/C++ 的范围,您必须查看您的实现文档.但我不知道任何常见的实现,除了可能带有特殊的调试标志或仪器。

标签: c++ c memory


【解决方案1】:

但它是否设置为零?

不/也许。无法保证未分配内存的“价值”。标准也没有任何方法可以保证观察到假设的“价值”。

从信息安全的角度来看:如果您将私人信息存储在一个对象中,那么您应该假设该信息即使在该对象的存储期限之后仍然存在。如果您的程序容易受到攻击(通常是通过未定义的行为),攻击者可能能够访问该信息。

【讨论】:

  • 注意:memset() 不是在返回之前清除内存的好方法。它可能会被优化出来。
  • 嗯,将目标投射到volatile unsigned char * 并使用循环效果很好。但其中的细节是另一个问题——而且很可能是一个骗局。 IAC,我喜欢这个答案开始的安全问题。
  • @chux-ReinstateMonica 嗯,我没想到volatile。我不确定在 UB 之前是否安全,但从技术上讲,它应该保证“写入”。
【解决方案2】:

不,该值未设置为零。但是你甚至不应该为它而烦恼,因为它的价值是不可访问的。它可能具有函数结束前的值,但访问它将是Undefined behavior

value 可能存在的原因是程序只会移动它的堆栈指针。下次堆栈到达该地址时,它只会用它需要的值重写它。

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 2011-05-23
    • 2011-08-17
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多