断言(assert)和程序的安全保证
断言,用来DEBUG错误的,在DEBUG时发现然后跟踪错误!
通常 写一个程序给别人使用的,这个代码在安全性上的要求是什么呢?直觉上,我们都知道程序不应该崩。但是通常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就是为了保证能出现这个最好结果,而不是莫名其妙的继续工作。要知道,“未定义”的行为就算是电脑爆炸掉都是符合逻辑的,当然,我们通常没有看到电脑爆炸,这是因为操作系统保证你的未定义行为的危害范围仅限于你的进程中。如果不是开玩笑的话,电脑爆炸的概率其实还是很小的,但是让代码跑飞到你不知道为什么出错那就相当普遍了。
本文转自 netcorner 博客园博客,原文链接:http://www.cnblogs.com/netcorner/archive/2007/08/21/2912299.html ,如需转载请自行联系原作者
断言(assert)和程序的安全保证相关推荐
- python(11)-if语句,断言assert
分支语句if 1.if基本语法 2 if语句的嵌套 3 比较运算符号 4 逻辑运算符: 5 整数随机数初应用 6 tip 7.断言assert 1.if基本语法 if语句开发中的应用场景:如果条件成立 ...
- java断言assert的概念_断言(assert)简介
java中的断言assert的使用 一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新. 从理论上来说,通 ...
- C语言断言assert函数用法大全
转载于:http://c.biancheng.net/c/assert/ 对于断言,相信大家都不陌生,大多数编程语言也都有断言这一特性.简单地讲,断言就是对某种假设条件进行检查.在 C 语言中,断言被 ...
- Java中的断言(assert)
为什么80%的码农都做不了架构师?>>> 一.语法形式: Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion), ...
- java断言assert初步使用:断言开启、断言使用
1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说"断言不具有继承性". 断言只适 ...
- C语言断言assert()函数
文章目录 断言(assert)的用法 用法总结与注意事项 1)在函数开始处检验传入参数的合法性 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 ...
- 断言(assert)详解
目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...
- python断言assert实例_Python断言assert的用法代码解析
在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...
- python断言assert实例_Python 拓展之断言(assert)
写在之前 大家好,这是首发在我公众号「Python空间」的第 60 篇文章,欢迎关注,期待和你的交流. 在昨天的文章中(零基础学习 Python 之处理异常)中学习了处理异常的正确姿势,今天我们继续来 ...
- java 断言 assert 初步使用:断言开启、断言使用
主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言只适用于复杂的调试过程. 断言一般用于程序执行结果的判断 ...
最新文章
- 财务python招聘_会计、财务、HR等重复性质岗位学习python有什么帮助?
- tableau必知必会之妙用 Lookup 函数同时跨行跨列取数
- ASP.NET和C#中对XML的操作,以及简单的xml与xsl !
- 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战
- spring react_使用Spring WebFlux构建React性REST API –第3部分
- 公式中表达单个双引号【】和空值【】的方法及说明
- Ubuntu 安装调整工具移动 Launcher 启动器位置
- 程序员初涉江湖 宜步步为赢(转-2) 作者:IT168 职业发展顾问Leo
- 使用Excel公式,获取 当前 Excel 文件 的 名字
- 鼠标单击元素输出对应元素的索引号
- iOS开发之App上架流程(2017)
- 采用Minitab进行logistic回归分析
- 内存数据库fastdb的使用研究报告
- 标书怎么做?标书制作教程附标书制作思维导图
- python创建sqlite3 gbk错误_请问django python用sqlite3模拟创建一个服务器时出现错误?...
- pyqt5,波形进度条
- SEG1数字中继模块(中继网关) 产品型号:SEG1
- iTunes Connect 人员如何使用testflight安装测试版ios应用
- arcgis风向_arcgis趋势分析
- AI识别PS篡改图像