一个进程的正常结束方式应当是从main函数调用exit返回(一般情况下),若是进程在main函数中调用longjmp进入了其他函数会发生什么情况呢?
程序的逻辑布局一般包括代码段、数据段、栈、堆...代码段是程序的指令集合。当一个函数被调用的时候,当前执行指令会跳转到被调用函数所对应代码段。而在跳转之前,会开辟一个该函数的栈帧,函数的返回地址(即当该函数执行完所应返回的地址)以及函数中所有的局部变量都会被保存于此栈,而这所有的动作被执行的前提是该函数显式的被调用。那么回到刚才的问题,在main函数中调用longjmp进入其他函数的时候,该函数不是被显示的调用,所以,该函数没有对应的栈帧,没有返回地址,什么都没有。当该函数所有的指令都被执行完成的时候,与该函数代码段相邻的数据会被当成指令执行,当这数据不是指令的时候就会引发段错误。
程序:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
jmp_buf jmpbuf;
void test_fun()
{
if (setjmp(jmpbuf) != 0)
printf("error\n");
}
int main(int argc, char* argv[])
{
test_fun();
longjmp(jmpbuf, 1);
exit(0);
}
运行结果:
error
段错误