gpt4 book ai didi

c - GNU C 中的激活记录(嵌套函数)

转载 作者:太空狗 更新时间:2023-10-29 15:07:38 25 4
gpt4 key购买 nike

在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 的指针


  1. 对吗?
    但是,如果函数 g 返回,它会怎样?
    删除了 g 的 Activation 和变量 z 的 Activation。
    然后在堆栈框架中,查找漏洞。

  2. 洞真的出现了吗?

  3. 并且根据行内 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/

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