处理方法调用时涉及到的行为:

保存现场,构造调用栈帧,传递参数,跳转到目标函数开始执行……目标函数执行完毕跳转回来,后从预定的位置取返回值(若需要),恢复现场,往下执行…

在静态分析中,更多的关注数据流,而非控制流。For Java,处理函数调用的数据流的过程:

1、确定目标方法

2、传递 receive object,经过 dispatch 之后,x.foo() 所调用的目标函数 foo 位于 类 T 里,继而把 x 所指的对象传递给 this

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-cf2f33e52e524737490de273452c7d6aa8bf9392_image-20201126184745576.png

3、传递参数

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-09b059d7e02b025dbfe44940cfc15407020da2d1_image-20201126185008506.png

4、传返回值

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-cf2f33e52e524737490de273452c7d6aa8bf9392_image-20201126184745576.png

栈帧(stack frame)中存储了函数参数、返回地址、保存的寄存器、局部变量,因此完整的栈结构可能如下所示:

函数栈帧

屏幕截图 2022-08-05 171053.png

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-191d4ddf762959928b517f05a0021e04fb499023_image-20201126231116221.png