异常后怎样实现安全返回

zm8zm 2014-01-30 07:37:14
下面的代码很明显会引发异常
asm {
mov eax,0
mov eax,[eax]
}
但是如果像下面这样
try
{
asm {
mov eax,0
mov eax,[eax]
}
}
catch (...)
{
return ;
}
函数可以安全返回,这太神奇了
如果只是捕捉异常可以用相关API实现,但是无法实现安全返回
因为不能恢复寄存器,也不能平衡堆栈,现在需要在其它环境当中实现这个功能
求教育
补充下,上面的代码都是在BC6当中测试的
...全文
255 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zm8zm 2014-03-05
  • 打赏
  • 举报
回复
放了这么久,是想你其它需要的伙伴们学习下,散分了
lm_whales 2014-03-02
  • 打赏
  • 举报
回复
setjmp 和 longjmp 其实就是备份寄存器和跳转,是在函数之间跳转 通过同一个数据 (全局的变量或者类似全局的)记录寄存器的值,然后跳转
mujiok2003 2014-03-02
  • 打赏
  • 举报
回复
VC 也支持seh的哦:/EHsc
lm_whales 2014-03-02
  • 打赏
  • 举报
回复
setjmp 和 longjmp 其实就是备份寄存器和跳转,是在函数之间跳转
lm_whales 2014-03-02
  • 打赏
  • 举报
回复
X86 异常 有几种 一种是异常处理后(特殊的硬件中断,比如页面不存在---缺页中断),重新执行 一种是异常处理后(各种正常的软中断,硬件中断),执行后面的语句(下一条指令的代码) 还有一种,是异常处理后程序退出执行,因为双重异常,程序无法继续执行. 而异常本身,一般就是个中断. C++ 的异常不同于C的异常,或者说,C++封装了C的异常的处理.C++异常跟C比起来,封装的比较好. C的异常称为结构化异常,处理异常的结果不同,执行不同的处理;这个可以看看结构化异常相关的文档 C 异常是对操作系统异常处理,和硬件异常和异常处理的封装,不过封装的非常原始. C++, 至少是某些C++ 实现,调用了 setjmp 和 longjmp 用于处理异常,不过还封装了析构局部变量的代码.
  • 打赏
  • 举报
回复
施主,路漫漫其修远兮,建议还是先弄明白一下什么是同步异常,异步异常吧~!!!
zm8zm 2014-01-31
  • 打赏
  • 举报
回复
上个世纪的技术到现在还是这么神秘,虽然只看个几本相关的书,但是没有一本提到怎么安全返回,反汇编只能看到是用的SEH,但是自身相关技术有限,而且异常这东西EIP是不可预测,搞了几天也没得出什么有价值的东西
zm8zm 2014-01-31
  • 打赏
  • 举报
回复
VS系统是没有这个功能 我用的是BC,第一个帖子也有说明 个人认为VS就是代码优化牛B,其它的不想评论 顺便更正下上面的函数名称 longjmp
wingzero1040 2014-01-31
  • 打赏
  • 举报
回复
可以安全返回?为什么我在 VS2010 里测试还是出错了?
zm8zm 2014-01-31
  • 打赏
  • 举报
回复
发现有两个这样的C函数 setjmp和lingjmp 可以实现安全返回 不过这样每个可能出现异常的线程都要自定义异常处理函数,相了想还是用现成的算了
zm8zm 2014-01-31
  • 打赏
  • 举报
回复
只有用BC写个DLL来调用了
zm8zm 2014-01-31
  • 打赏
  • 举报
回复
晕,怎么一个个都这样,虽然我是新来的,但是自认也不是菜鸟了,真不知道论坛怎么一个个只知道。。。
taodm 2014-01-30
  • 打赏
  • 举报
回复
路太长,你还需要看非常非常多的关于异常的书,然后就发现自己其实是在错误的问题上浪费时间寻找正确解。
zm8zm 2014-01-30
  • 打赏
  • 举报
回复
我说的在其它环境实现,是指在不支持异常处理的开发工具当中自己实现异常后能够安全返回的功能

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧