码迷,mamicode.com
首页 > 其他好文 > 详细

SEH-关于捕获memcpy的异常

时间:2014-10-29 16:13:55      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:des   blog   http   io   ar   使用   sp   div   on   

网上有说memcpy是C语言写的,没有异常处理机制。

但是貌似SEH可以处理。

SEH("Structured Exception Handling"),即结构化异常处理·是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。

 在VS2010编译器中,项目属性->C++->代码生成->启用C++异常  设置为:有,但有SEH异常(/EHa)

 

以下文字来自:http://www.cppblog.com/mzty/archive/2006/09/22/12824.html

SEH 是 Windows 系统提供的功能,跟开发工具无关。值得一提的是,VC 将 SEH 进行了封装 try  catch  finally,c++中也可以用c的封装 __try{}__except(){} 和 __try{}__finally{}. 所以当你建立一个C++ try块时,编译器就生成一个S E H__t r y块。一个C + +c a t c h测试变成一个S E H异常过滤器,并且c a t c h中的代码变成S E H__e x c e p t块中的代码。实际上,当你写一条C++ throw语句时,编译器就生成一个对Wi n d o w s的R a i s e E x c e p t i o n函数的调用。用于t h r o w语句的变量传递给R a i s e E x c e p t i o n作为附加的参数。

 

一个简单的使用SEH的例子

假如要实现一个完全强壮的应用程序,该程序需要每周7天,每天2 4小时运行。在今天的世界里,软件变得这么复杂,有那么多的变量和因子来影响程序的性能,笔者认为如果不用S E H,要实现完全强壮的应用程序简直是不可能的。我们先来看一个样板程序,即C的运行时函数s t r c p y:

bubuko.com,布布扣 char *  strcpy(bubuko.com,布布扣    char *  strDestination,bubuko.com,布布扣    const   char *  strSource);

这是一个相当简单的函数,它怎么会引起一个进程结束呢?如果调用者对这些参数中的某一个传递N U L L(或任何无效的地址),s t r c p y就引起一个存取异常,并且导致整个进程结束。
使用S E H,就可以建立一个完全强壮的s t r c p y函数:

bubuko.com,布布扣 char *  RobustStrCpy( char *  strDestination,  const   char *  strSource)
bubuko.com,布布扣 {
bubuko.com,布布扣   __try 
bubuko.com,布布扣    {
bubuko.com,布布扣      strcpy(strDestination, strSource);
bubuko.com,布布扣   } 
bubuko.com,布布扣   __except(EXCEPTION_EXECUTE_HANDLER)
bubuko.com,布布扣    {
bubuko.com,布布扣       //  Nothing to do here 
bubuko.com,布布扣    } 
bubuko.com,布布扣    return (strDestination);
bubuko.com,布布扣

这个函数所做的一切就是将对s t r c p y的调用置于一个结构化的异常处理框架中。如果s t r c p y执行成功,函数就返回。如果s t r c p y引起一个存取异常,异常过滤器返回E X C E P T I O N _E X E C U T E _ H A N D L E R,导致该线程执行异常处理程序代码。在这个函数中,处理程序代码什么也不做,R o b u s t S t r C p y只是返回到它的调用者,根本不会造成进程结束。

SEH-关于捕获memcpy的异常

标签:des   blog   http   io   ar   使用   sp   div   on   

原文地址:http://www.cnblogs.com/coolbear/p/4059469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!