在GNU C中,Result是13。因为使用了静态链接。
否则,如果使用动态链接,结果将是 16。
#include <stdio.h>
int h(){
int x = 1;
int g(int z){
return z + x; <------------------ P
}
int f(int y){
int x = y + 1;
return g(x * y);
}
return f(3);
}
int main(){
int a = h();
printf("%d\n", a);
}
在P点,Activation Record是
z = 12
x = 4
y=3
f 和指向代码 f 的指针
g 和指向代码 g 的指针
x = 1
h 和指向代码 h 的指针
一个
main 和指向代码 main 的指针
对吗?
但是,如果函数 g 返回,它会怎样?
删除了 g 的 Activation 和变量 z 的 Activation。
然后在堆栈框架中,查找漏洞。洞真的出现了吗?
并且根据行内 block ,在函数h中,
变量 x 是最外层的 block 。 (这意味着函数 g' block 嵌套在变量 x 的 block 中) 下一个外部 block 是函数 g,下一个函数 f... 那么,函数f的静态链接是否指向函数g的帧指针? 或者函数h的帧指针? 函数 g 的静态链接呢?
最佳答案
在p点,栈上有4条激活记录:
g的激活记录:
- 返回地址给f
- h 激活记录的静态链接
- z =
12
f 的激活记录:
- x =
4
- 返回地址给h
- h 激活记录的静态链接
- y =
3
h的激活记录:
- x =
1
- 返回主地址
主要激活记录:
- a = 未定义
- 返回地址给操作系统
嵌套函数的每个激活记录都包含一个指向词法封闭激活记录的链接(这里两种情况下都是 h),该链接是在调用函数和创建激活记录时设置的。在 p 点,代码将取消引用该链接以找到 x 的值,并且查看此类链接是函数查看其他函数的激活记录的唯一时间。
关于c - GNU C 中的激活记录(嵌套函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6316780/