#include <stdio.h> #include <unistd.h> #include <stdlib.h> void fun() { printf("i am the evil func\n"); exit(1); } int fun1(int a,int b) { int *p=&a; p--; *p=fun; int c=0xcccc; return c; } int main() { printf("begin run..\n"); int a=0xaaaa; int b=0xbbbb; fun1(a,b); printf("right end"); return 0; }
linux下执行结果:
main调用fun1调用fun---exit退出
对于此结果的问题:
明明没有调用fun函数,为什么会执行fun函数,函数是如何进行跳转的?
栈帧是怎么样保存信息并返回的?
分析原因:
查看汇编代码中的重要的栈段
简易栈帧图
下面一个程序通过指针访问变量y的值,而不是变量名y
#include <stdio.h> int fun(int x,int y) { int *p = x; p--; return *p; } int main() { int x=1; int y=2; int ret=fun(x,y); printf("y的值是%d\n"ret); return 0; }
原理就是p-->x,p--之后,p指向y
此时*p访问的就是y的值