美文网首页
函数调用为何会发生栈溢出(第7讲)

函数调用为何会发生栈溢出(第7讲)

作者: 牛牛_735d | 来源:发表于2019-08-06 11:12 被阅读0次

一、为什么需要程序栈
示例代码:

// function_Example.c
#include <stdio.h>
int static add(int a, int b) 
{
    return a+b;
}

int main()
{
   int x = 5;
   int y = 10;
   int u = add(x, y);
}

编译代码、使用objdump打印出来

int static add(int a, int b)
{
   0:   55                      push   rbp   # bp是基址指针寄存器、处理函数调用、 push rbp 就是先将rbp的内存保存入栈
   1:   48 89 e5                mov    rbp,rsp #将rsp的值赋给rbp(rbp始终执行栈帧底部、rsp始终指向栈帧顶部)
   4:   89 7d fc                mov    DWORD PTR [rbp-0x4],edi
   7:   89 75 f8                mov    DWORD PTR [rbp-0x8],esi
    return a+b;
   a:   8b 55 fc                mov    edx,DWORD PTR [rbp-0x4]
   d:   8b 45 f8                mov    eax,DWORD PTR [rbp-0x8]
  10:   01 d0                   add    eax,edx
}
  12:   5d                      pop    rbp
  13:   c3                      ret    
0000000000000014 <main>:
int main()
{
  14:   55                      push   rbp
  15:   48 89 e5                mov    rbp,rsp
  18:   48 83 ec 10             sub    rsp,0x10
    int x = 5;
  1c:   c7 45 fc 05 00 00 00    mov    DWORD PTR [rbp-0x4],0x5
    int y = 10;
  23:   c7 45 f8 0a 00 00 00    mov    DWORD PTR [rbp-0x8],0xa
    int u = add(x, y);
  2a:   8b 55 f8                mov    edx,DWORD PTR [rbp-0x8]
  2d:   8b 45 fc                mov    eax,DWORD PTR [rbp-0x4]
  30:   89 d6                   mov    esi,edx
  32:   89 c7                   mov    edi,eax
  34:   e8 c7 ff ff ff          call   0 <add>
  39:   89 45 f4                mov    DWORD PTR [rbp-0xc],eax
  3c:   b8 00 00 00 00          mov    eax,0x0
}
  41:   c9                      leave  
  42:   c3                      ret    

二、如何使用函数内联进行优化
-O 指令 或者 加上 inline关键字、来提示编译器进行函数内联

内联带来的优化是、CPU需要执行的指令数变少了、根据地址跳转的过程不需要了、压栈和出栈的过程也不需要了

但是内联意味着、把可复用的程序指令在调用它的地方完全展开了、若一个函数在很多地方都被调用了、就会被展开多次、整个程序占用的空间就会变大

readelf -s link_example.o //查看符号表
objdump -r link_example.o //查看重定位表

相关文章

  • 函数调用为何会发生栈溢出(第7讲)

    一、为什么需要程序栈示例代码: 编译代码、使用objdump打印出来 二、如何使用函数内联进行优化-O 指令 或者...

  • 看完必会的正则表达式和递归

    1,递归 递归函数:一个函数在内部可以调用其本身 递归容易发生栈溢出错误(stack overflow),以上是一...

  • 算法--策略-递归

    函数直接或间接调用自身 函数的调用过程 如果递归调用没有终止, 将会一直消耗栈空间, 最终导致栈溢出 所以必须有一...

  • 关于Python的递归函数

    使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用...

  • Python学习之路(递归函数)

    函数之 递归函数 小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通...

  • 从尾到头打印链表

    单向链表的节点定义 栈实现 递归实现 当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出...

  • 堆栈基础(一)

    新手入门pwn之栈溢出系列,先学习堆栈的基础,函数调用栈这些. 运行时栈 运行时栈(runtime stack)是...

  • py高级特性及递归函数

    首先是上一章函数的最后一块——递归函数 递归函数:函数在内部调用自身 逻辑清晰 注意:栈溢出 计算机调用一次函数,...

  • 9. 递归函数

    使用递归函数需要注意防止栈溢出解决递归调用栈溢出的方法是通过尾递归优化遗憾的是,大多数编程语言没有针对尾递归做优化...

  • python学习4

    学廖雪峰老师的python教程笔记。 1、递归函数 函数内部调用该函数本身,比循环逻辑简单 注意防止栈溢出 尾递归...

网友评论

      本文标题:函数调用为何会发生栈溢出(第7讲)

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