【发布时间】:2011-07-08 07:57:30
【问题描述】:
我在阅读 bruce eckel 时遇到了以下段落。他试图解释为什么函数在堆栈上返回值是不安全的
现在想象一下,如果一个普通函数试图在堆栈上返回值会发生什么
.you can,t touch any part of the stack that above the return address,因此函数必须将值压入返回地址以下。但是当汇编语言返回执行时,堆栈指针必须指向返回地址(或正下方,取决于您的机器),所以在 RETURN 之前,函数必须向上移动堆栈指针,从而清除所有局部变量。如果你是试图在返回地址下方的堆栈上返回值,此时您会变得容易受到攻击,因为可能会出现中断。ISR 会将堆栈指针向下移动以保存其返回地址及其局部变量并覆盖你的返回值
您愿意帮助我理解粗斜体文字吗?
【问题讨论】:
-
这确实描述了一个糟糕的调用约定,所以我在整个段落中看不到重点。但可能我不知道它的上下文......你最终可以使用堆栈来返回值的调用约定,但调用者应该为它保留堆栈空间!
-
报价中缺少一条重要信息。作者很可能在谈论返回一个 reference 或 pointer 到堆栈中的元素,而不是返回堆栈中的实际元素(这将创建一个副本)