VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)
IDE:VC6
今天遇到一个小问题,把我郁闷了好久,××医生的VulEngine不时在wcsstr处发生crash,加了一番强大的参数检查后,再加上了强大的try catch,其实不是很喜欢用try和catch,总觉得一个完美的程序,应该代码的每一处都可以被程序员控制的,我倾向如对函数的返回值和参数进行强制的检查,当然这就要求你自己设计的函数必须也得满足这些要求,不过事情牵扯到读写文件,处理字符串等等繁琐的操作,偶尔用一用try catch是比较简洁的,我在wcsstr前后加上异常处理代码后,debug下very perfect,出现异常(空指针,字符串不可读)时,被捕捉到了,程序不再crash,但是,release下依然会出现崩溃的问题,what,happend?
后来去查了下资料才知道,在release下,如果在try语句块中(包括调用的函数)没有throw语句,则,整个try catch会被编译器给优化掉,不过这是符合C++标准的,因为C++标准说,catch必须能捕获程序中所有通过throw语句抛出的异常;至于内存访问违例,被0除等等系统异常则C++标准并未做要求,不过VC下的扩展_try _catch貌似是可以的,比较强大。现在想来,还真是杯具,以前不知道写过多少try catch但是从未去认真关注个这个问题,也不知道有没有被优化掉而让自己脆弱的代码像裸体一样暴露在挑剔的windows面前。
要解决上面的问题也不难,在编译选项中加入/EHa即可防止编译器优化try语句。
总的来说,C++的异常处理还是比较依赖于不同的编译器和系统的,不是很稳定,移植性也比较差,Java的异常处理又总觉得不灵泛,让人没有选择,反倒是比较喜欢Python的异常处理机制,嘿嘿。
windows平台下的异常处理强大的原因在于系统的SEH(结构化异常)处理机制,其实try catch也是使用SEH的变形封装实现的。最近正在看这方面的资料,有点心得了再写。
- try
- {
- wchar_t* pch;
- pch = (wchar_t*)0x10001022;
- wcsstr(pch, L"abc");
- }
- catch(...)
- {
- printf("Catched a exception/n");
- }
http://blog.csdn.net/magictong/article/details/5504735
VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)的更多相关文章
- Windows Vista下UIPI和Windows消息的故事(UIPI默认情况下会禁止所有高于WM_USER的消息)
一. 什么是UIPI UIPI指User Interface Privilege Isolation(用户界面特权隔离),是Windows Vista 新引入的一种安全特性.用于拦截接收比自身进程MI ...
- 如何使用终端默认情况下阻止Mac应用保存到iCloud
当您保存要在Mac上的Pages,Numbers,TextEdit或其他基于云的应用程序中处理的文档时,该保存的默认位置是iCloud.尽管这对某些人或某些文档来说可能是一件好事,但您可能会厌倦每次更 ...
- Sql Server优化之索引提示----我们为什么需要查询提示,Sql Server默认情况下优化策略选择的不足
环境: Sql Server2012 SP3企业版,Windows Server2008 标准版 问题由来: 最近在做DB优化的时候,发现一个存储过程有非常严重的性能问题, 由于整个SP整体逻辑是一个 ...
- mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法
mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法 满头大汗的宅鸟该怎么办呢? mysql -u root -e "show processlist"|grep -i ...
- UIView的clipsToBounds属性,layoutSubViews及触摸事件传递(默认情况下)总结
一.UIView的clipsToBounds属性 * 默认情况下,超出父控件尺寸范围的子控件还是可见的 * 如果设置父控件的clipsToBounds=YES,就会裁剪掉超出父控件尺寸范围内的子控件, ...
- jquery Tab默认情况下自动切换
<!DOCTYPE html><html lang="zh-CN"><head><meta http-equiv="Conten ...
- 默认情况下,不使用of子句表示在select所有的数据表中加锁(转)
Select …forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...
- target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件
target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件
- [VS] - "包含了重复的“Content”项。.NET SDK 默认情况下包括你项目中的“Content”项。
copy to :http://www.cnblogs.com/jinzesudawei/p/7376916.html VS 2017 升级至 VS 2017 v15.3 后,.Net Core 1 ...
随机推荐
- ServletContextListener接口用法
ServletContextListener接口用于tomcat启动时自动加载函数,方法如下: 一.需加载的类必须实现ServletContextListener接口. 二.该接口中有两个方法必须实现 ...
- Azure Messaging-ServiceBus Messaging
Azure Messaging-ServiceBus Messaging 上篇博文中我们介绍了Azure Messaging的重复消息机制.At most once 和At least once. A ...
- 设置m_pszAppName值的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 CWinApp::m_pszAppName用于指定应用程序的名字.昨天这样修改它的值: m_pszAppName = ...
- http_load测试入门
大致步骤: 1.在对应文件夹下边新建.TXT文件: 2.在该文件下填上待测试URL地址,建议100行以上: 3.管理员权限CMD,对应目录下运行命令即可,如: a) http_load -pa ...
- python 整数中1出现的次数
把整数转换为字符串 用count计数 # -*- coding:utf- -*- class Solution: def NumberOf1Between1AndN_Solution(self, n) ...
- Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象
原文:Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象 原创文章,如需转载,请注明出处. 最近在一直研究Silve ...
- 在.net MVC项目中使用ajax进行数据验证
1.首先要在网页引入应该引入的js文件 在这里回顾一下在模板页里面挖坑的技术 2.在html中使用html辅助方法 3.验证模型 4验证方法
- ZOJ 2319 Beatuiful People(单调递增序列的变形)
Beautiful People Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge The most prest ...
- Qt使用预编译头文件Using Precompiled Headers(提升10倍以上)
预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能.在随后的编译中,编译器将加载存储状态继续编译指定的文件.每一个随后的编译将更快,因为稳定的代码不需 ...
- 安装在谷歌axure小工具
下载插件 第一步 第二步 第三步 第四步 版权声明:本文博客原创文章.博客,未经同意,不得转载.