当我们 return 从函数
Is the stack frame of a function cleared, or is it left as such on the stack, when we return from the function
在网上查了很多,都说栈上的栈帧被清除(销毁),当一个函数returns。
但我怀疑,情况并非如此。
我正在并排使用汇编语言和我的 C++ 代码进行调试,从 C++ 代码来看,堆栈帧似乎没有被清除,但在 main() 调用另一个函数时被覆盖了。
我并排看了汇编代码。而且,当我们将一个值弹出回寄存器时,是否只是将堆栈中的值复制回寄存器,并且不会对堆栈采取进一步的操作。或者,是将值复制到寄存器并从堆栈中删除?
C++代码:
#include<iostream>
using namespace std;
int* MyFunc(int*);
int main() {
int* a, b;
b = 10;
a = MyFunc(&b);
return 0;
}
int* MyFunc(int* ptrB)
{
int inta;
inta = (*ptrB) * (*ptrB);
return (&inta);
}
现在,当MyFunc returns &inta时,main中的a获取到inta的地址。但这很危险,因为如果调用另一个函数,将 inta 的地址分配给 a 之后 - 在该步骤之后取消引用 a(即 *a)将是未定义的。因为inta地址的内容可能会被覆盖。
看起来 inta 的地址被覆盖了。而不是MyFunc的栈帧被清除(cleaned up,emptied)的情况,当MyFuncreturns到main的时候。
我这么说是因为 *a 在它之前调用函数时可能仍会给出正确的结果。
当函数 returns 时,MyFunc 堆栈帧未被清除(清空、销毁)的假设是否正确?只是堆栈指针 (ESP) 移动到 main?
所有数据都保留在内存中。唯一更改的参数是栈顶指针 (esp) 和栈帧基址 (ebp)。栈帧是一个有点抽象的概念,它只是由这两个寄存器的值定义的。因此,esp 上方的区域是 "not visible",即使它可能包含先前堆栈帧留下的数据
在网上查了很多,都说栈上的栈帧被清除(销毁),当一个函数returns。
但我怀疑,情况并非如此。
我正在并排使用汇编语言和我的 C++ 代码进行调试,从 C++ 代码来看,堆栈帧似乎没有被清除,但在 main() 调用另一个函数时被覆盖了。
我并排看了汇编代码。而且,当我们将一个值弹出回寄存器时,是否只是将堆栈中的值复制回寄存器,并且不会对堆栈采取进一步的操作。或者,是将值复制到寄存器并从堆栈中删除?
C++代码:
#include<iostream>
using namespace std;
int* MyFunc(int*);
int main() {
int* a, b;
b = 10;
a = MyFunc(&b);
return 0;
}
int* MyFunc(int* ptrB)
{
int inta;
inta = (*ptrB) * (*ptrB);
return (&inta);
}
现在,当MyFunc returns &inta时,main中的a获取到inta的地址。但这很危险,因为如果调用另一个函数,将 inta 的地址分配给 a 之后 - 在该步骤之后取消引用 a(即 *a)将是未定义的。因为inta地址的内容可能会被覆盖。 看起来 inta 的地址被覆盖了。而不是MyFunc的栈帧被清除(cleaned up,emptied)的情况,当MyFuncreturns到main的时候。 我这么说是因为 *a 在它之前调用函数时可能仍会给出正确的结果。 当函数 returns 时,MyFunc 堆栈帧未被清除(清空、销毁)的假设是否正确?只是堆栈指针 (ESP) 移动到 main?
所有数据都保留在内存中。唯一更改的参数是栈顶指针 (esp) 和栈帧基址 (ebp)。栈帧是一个有点抽象的概念,它只是由这两个寄存器的值定义的。因此,esp 上方的区域是 "not visible",即使它可能包含先前堆栈帧留下的数据