注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

断言(assert)和程序的安全保证  

2007-08-08 14:09:27|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
写一个程序给别人使用的,这个代码在安全性上的要求是什么呢?直觉上,我们都知道程序不应该崩。但是通常C/C++的程序如果把包含API的头文件暴露出 来的话,根本没办法保证这一点。往往,如果一个C/C++的程序以头文件提供给别人使用的话,其安全性保证应该是“正确使用的时候一定不会崩,错误使用的 时候尽最大可能的尽早崩”。
我刚知道assert的时候把assert的作用和异常搞混淆了,我以为assert和异常用途一样,其实C标准写得很明白,assert当条件不满足的 时候就会调用abort,abort就是制造程序崩溃。也就是说,assert的用处是上面所说的“错误使用的时候尽最大可能的尽早崩”。
错误使用是什么意思呢?
首先,这里的“错误使用”只能是程序员的错误,而不应该是最终用户进行了错误的操作,因为最终用户永远是没错的,最终用户无论怎么在你的GUI上乱点,或者在CUI输入一些无论怎样的稀奇古怪的东西,你都不能崩,你只能一遍又一遍的告诉用户,你不能这么干,不能那么干。
其次,C++提供给高级语言的接口,不能崩,从高级语言来的调用,无论参数是什么,都不能算它误用。比如说你用C++写了一个COM控件,可以用来算整数 的加法,然而客户程序传了一个字符串进来,你不能崩,你应该耐心的告诉客户程序不应该传字符串。否则用户浏览一个写了错误的JavaScript的网页时 就会把浏览器崩掉了。
最后,解析网络协议的时候,不能崩,永远不能信任网络对面传过来的协议是正确的,更不能依靠assert来确保这个正确性。

也就是说,assert的用处就仅限于保证你自己的C/C++代码内部的代码编写正确,以及你通过一个C/C++头文件把一个库提供给别人的时候的代码编 写正确。而且,当你用assert来检查客户进行了错误的输入的时候,你一定要在文档注明,这样的输入是错误的,行为是未定义的。“未定义”的行为的最好 结果就是崩掉,用assert就是为了保证能出现这个最好结果,而不是莫名其妙的继续工作。要知道,“未定义”的行为就算是电脑爆炸掉都是符合逻辑的,当 然,我们通常没有看到电脑爆炸,这是因为操作系统保证你的未定义行为的危害范围仅限于你的进程中。如果不是开玩笑的话,电脑爆炸的概率其实还是很小的,但 是让代码跑飞到你不知道为什么出错那就相当普遍了。
  评论这张
 
阅读(324)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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