美文网首页
利用函数参数地址寻址的问题

利用函数参数地址寻址的问题

作者: qc1iu | 来源:发表于2018-07-02 17:06 被阅读6次

之前在用C语言编程的时候,有些时候会利用stack的布局做一些操作.我之前在 实现垃圾收集器算法的时候就会使用函数参数的地址,用这个地址作为基址在 stack上寻找我想要的数据. 这篇文章 里面详细介绍了stack的布局,以及编译器在编译函数时自动产生的前言和结语等问题. 对这个垃圾收集算法感兴趣的可以看 这里. 我在写这个算法的时候就发现当使用clang编译器编译后,函数参数在stack中的布局 跟预期的不一样.这是 sf上提出的一个问题

后来在工作中涉及到了不少关于stack balance的问题,其中有些需求让我不得不 读反编译后的代码.

对于这样一个函数

int add(int a, int b)
 {
      return a + b;
 }

其用clang编译后,反编译结果如下

 080483c0 <add>:
    80483c0:   55                      push   %ebp
    80483c1:   89 e5                   mov    %esp,%ebp
    80483c3:   83 ec 08                sub    $0x8,%esp
    80483c6:   8b 45 0c                mov    0xc(%ebp),%eax
    80483c9:   8b 4d 08                mov    0x8(%ebp),%ecx
    80483cc:   89 4d fc                mov    %ecx,-0x4(%ebp)
    80483cf:   89 45 f8                mov    %eax,-0x8(%ebp)
    80483d2:   8b 45 fc                mov    -0x4(%ebp),%eax
    80483d5:   03 45 f8                add    -0x8(%ebp),%eax
    80483d8:   83 c4 08                add    $0x8,%esp
    80483db:   5d                      pop    %ebp
    80483dc:   c3                      ret
    80483dd:   0f 1f 00                nopl   (%eax)

可以看到中间有4句mov指令做了stack拷贝操作.拷贝后stack布局变成

 +---------+
 |high     |
 +---------+
 |101      |<-arg2
 +---------+
 |99       |<-arg1
 +---------+
 |ret      |
 +---------+
 |ebp      |
 +---------+
 |99       |<-a
 +---------+
 |101      |<-b
 +---------+
 |low      |
 +---------+

这一步拷贝操作导致用参数的地址作为地址来寻址会遇出错.当时在实现垃圾收集 算法的时候还以为clang的参数计算顺序问题,或者是ABI的问题,现在看来还是图 样.

回过头来看这个问题,clang这么做在效率上会有损失,但是的确是符合逻辑的. 这样的一个参数拷贝操作之后,使得函数的参数都在自己的frame当中,而不像之 前一样,函数的参数在其caller的frame中. 这个问题也说明,利用函数参数地址来进行stack上的寻址操作是有潜在风险的.

相关文章

  • 利用函数参数地址寻址的问题

    之前在用C语言编程的时候,有些时候会利用stack的布局做一些操作.我之前在 实现垃圾收集器算法的时候就会使用函数...

  • go语言那些“坑”之函数切片参数

    函数的切片参数问题 输出结果: test变量容量足够容纳addElement函数添加的元素,所以在函数中ret地址...

  • swift - 泛型

    泛型函数中利用占位字来表示实际的类型名称,如Int,double等等 inout表示引用传入参数的内存地址 函数名...

  • 善用GDB 调试一些函数栈被毁坏的问题

    最近一些问题的现象一开始难以解释,函数的参数地址在函数内部被传递给另外的函数,然后发现地址发生了改变,这样的情况称...

  • 7月9号

    1 //数组作为函数参数,可以省略元素个数 //数组作为函数参数,传递是整个数组的地址,修改函数形参数组元素的值,...

  • 完美转发

    解决的问题 当一个函数接收右值参数后,再将此参数传给另外一个函数时本是右值的参数变成左值,造成无法利用针对右值的性...

  • hashmap、hashtable

    Hashmap:数组+链表通过hash函数计算下标值 哈希冲突解决办法:开放寻址法,再散列函数法,链地址法 Has...

  • Linux学习1(虚拟地址、物理地址、地址映射)

    虚拟地址 在虚拟内存出现以前,程序寻址用的都是物理地址,这种方式存在几个问题1、程序能寻址的范围是有限的,取决于C...

  • 廖雪峰python练习题

    函数式编程之高阶函数 map 用map匹配各函数对应参数 filter 利用filter特性,输出一个函数,利用此...

  • 指针函数、函数指针

    指针函数 定义返回地址的函数。首先是一个函数,然后返回一个地址。 格式** 类型名 函数名(函数参数列表)*例如:...

网友评论

      本文标题:利用函数参数地址寻址的问题

      本文链接:https://www.haomeiwen.com/subject/rumluftx.html