以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:
- try
- {
-
BYTE*pch;
-
pch=(BYTE*)00001234;//给予一个非法地址
-
*pch=6;//对非法地址赋值,会造成Access Violation 异常
- }
-
catch(...)
- {
-
AfxMessageBox("catched");
- }
这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。 但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构, 上述代码如果改成如下代码异常即可捕获。
- __try
- {
-
BYTE*pch;
-
pch=(BYTE*)00001234;//给予一个非法地址
-
*pch=6;//对非法地址赋值,会造成Access Violation 异常
- }
-
__except(EXCEPTION_EXECUTE_HANDLER)
- {
-
AfxMessageBox("catched");
- }
但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712的编译错误。 那么还有没有别的办法呢?
当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入/EHa的参数。这样VC编译器不会把try catch模块给优化掉了。
/EHa means "Do the right thing, no matter what happens". /EHsc means "Take every shortcut you can find". There's a notable cost associated to exception handling, notably in 32-bit mode because of the cost of setting up the SEH chain. /EHsc is there to let you to tell the compiler "do the best you can".
http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/80d7ae59-141c-4993-bd1f-6bcb72be000b
分享到:
相关推荐
详细介绍VC编译开关/EHsc /EHa /EHc
/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /EHsc /RTC1 /MLd /YX"stdafx.h" /Fp".\Debug/topSort.pch" /Fo".\Debug/" /Fd".\Debug/" /W3 /c /ZI /TP .\topSort.cpp ] 正在创建命令行“cl.exe @f:\第...
主要内容:1.MFC对话框中编辑框字体大小与颜色的设置;2.List control控件的使用实例代码;3.VS2005编写。
XP系统在使用搜索时出现意外错误情况。EXPLORER没问题,可以运行资源中的两个文件解决问题。
8进制发生器 这是一个用C ++编写的小程序,它使用一种算法为给定的BSSID计算8长度的十六进制密钥。 要在Windows上编译... ./8hex | pyrit -r CAP.cap -i- attack_passthrough 将其输出输送到 参数 BSSID 提供00:11
Vim电源模式 Vimmers的电源模式 它是如何工作的 用法 :PowerModeOn :PowerModeOff 去做 将在Linux / Unix上工作 安装 克隆项目 ... 在C:/ Windows中制作cl.bat(将12.0更改为VS版本)...cl -EHsc -Feparticle particle.cp
cerrThe object controls unbuffered insertions to the standard error output as a byte stream. Once the object is nstructed, the expression cerr.flags & unitbuf is nonzero. Example // iostream_...
二进制求补运算符:~ 语法 ...访问程序中的 compl 运算符有两种方式:包括头文件 iso646.h,或使用 /Za 进行编译。 // expre_One_Complement_Operator.cpp // compile with: /EHsc #include <io
// compile with: /EHsc #include using namespace std; int main() { int a = 2, b = 4, c = 9; cout << a + b * c << \n; cout << a + (b * c) << \n; cout << (a + b) * c &...
C99•单一来源•与平台无关•类似XNA•感知分配器•游戏开发库•从很棒的... # -c compiles the code as a library# -EHsc disables exceptions on msvcgcc -c rayfork.cclang -c rayfork.ccl -c -EHsc rayfork.c原则
Windows运行时研讨会 介绍Windows运行时技术 如何在标准C ++中构建Windows运行时 Visual Studio编译/链接命令: cl sample.cpp / Zc:wchar_t / EHsc / Gm / W4 / D“ _UNICODE” / D“ UNICODE”
虚函数 虚函数是应在派生类中重新定义的成员函数。 当使用指针或对基类的引用来引用派生的类对象时,可以为该对象调用虚函数并执行该函数的派生类版本。...// compile with: /EHsc #include <iostream>
LuaBridge 3.1 是一个轻量级且无依赖的库,用于在C ++和 (一种强大,快速,轻量级,可嵌入的脚本语言)之间来回... 可以使用c ++异常,也可以不使用c ++异常(与-fno-exceptions和/EHsc- )。 以清晰且易于调试的