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

标签 c memory stack nested-function activation-codes

在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/

相关文章:

c++ - 如何定义一个地址为空的对象?

c - C 中的双向链表

java jstack工具内存不足或附加权限不足

c - 在释放指针变量指向的内容后重用它们是否安全?

mysql - 了解mysql内存消耗

调用堆栈没有提供线索

android - 跨原生 GCC 4.8 构建 : libcpp Error: invalid conversion from long long to off_t (aka long int)

c - 函数局部变量的字节分配以及 POP 指令是否仅调用一次

memory - WebKit 中的最大调用堆栈大小是 V8 的三倍吗?为什么?

C++ 一些堆栈问题