注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

setjmp,longjmp非局部跳转  

2015-10-12 08:53:06|  分类: 原理分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前做的一个暴力破解密码的程序,里面的递归函数当满足条件的时候是直接exit,
这里我一直以为不够完美,如果满足后还有其他事情处理那咋办,你直接结束程序还处理个屁?
但是用break,goto,ret感觉都不对,必须能够把递归函数的堆栈退回到调用递归函数前的状态才行!
昨天看到一个setjmp,longjmp实例,感觉可以用这个方法转移流程。

setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力。

函数说明(来自wiki百科):

int setjmp(jmp_buf env)建立本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处。这个子程序保存程序的调用环境于env参数所指的缓冲区,env将被longjmp使用。如果是从setjmp直接调用返回,setjmp返回值为0。如果是从longjmp恢复的程序调用环境返回,setjmp返回非零值。
void longjmp(jmp_buf env, int value)恢复env所指的缓冲区中的程序调用环境上下文,env所指缓冲区的内容是由setjmp子程序调用所保存。value的值从longjmp传递给setjmplongjmp完成后,程序从对应的setjmp调用处继续执行,如同setjmp调用刚刚完成。如果value传递给longjmp零值,setjmp的返回值为1;否则,setjmp的返回值为value

调用setjmp保存当前的堆栈状态,返回一个值0。返回零时正常执行,非零时认为是非局部跳转过来的。
用longjmp恢复堆栈跳转到setjmp的地方去,并传递一个参数。根据这个参数作为非局部跳转的判断依据。

r = setjmp(env)
if (r != 0)
{
// 非局部跳转过来之后的处理
}

f() // 要非局部跳转的函数
{
longjmp(env, 1);
}
  评论这张
 
阅读(50)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017