断言,用来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就是为了保证能出现这个最好结果,而不是莫名其妙的继续工作。要知道,“未定义”的行为就算是电脑爆炸掉都是符合逻辑的,当然,我们通常没有看到电脑爆炸,这是因为操作系统保证你的未定义行为的危害范围仅限于你的进程中。如果不是开玩笑的话,电脑爆炸的概率其实还是很小的,但是让代码跑飞到你不知道为什么出错那就相当普遍了。

断言(assert)和程序的安全保证的更多相关文章

  1. 断言(assert)

    断言(assert):用来调试.测试代码. 格式: assert 布尔表达式: 字符串 (如果布尔表达式为false时,这个字符串才会显示). 注意: assert默认是关闭的,使用时需要使用&quo ...

  2. 断言(assert)简介

    java中的断言assert的使用 一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新. 从理论上来说,通 ...

  3. 断言(assert)的用法

    我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”. 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解 ...

  4. C语言中断言ASSERT

    我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错". 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种&qu ...

  5. 使用断言assert

    之前有看过关于Assert的书,但是不懂得如何去用,最近看别人写的代码有用这个断言(assert),今天自己动手看看如何使用断言. 断言(assert)的语义如下:如果表达式的值为0(假),则输出错误 ...

  6. 断言Assert的使用

     转载地址:http://www.cnblogs.com/moondark/archive/2012/03/12/2392315.html 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏 ...

  7. K:java 断言 assert 初步使用:断言开启、断言使用

    @转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...

  8. java的断言(assert)

    概述 在C和C++语言中都有assert关键,表示断言.在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.在Java中,assert关键字是从JAVA SE 1.4 引入的,为了 ...

  9. C# 断言 Assert

    重构-断言 现象:某一段代码需要对程序状态做出某种假设 做法:以断言明确表现这种假设 动机: 常常有这种一段代码:只有某个条件为真是,该改名才能正常运行. 通常假设这样的假设并没有代码中明确表现出来, ...

  10. java断言assert初步使用:断言开启、断言使用

    1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说“断言不具有继承性”. 断言只适用复杂的调式过程. ...

随机推荐

  1. 用mapreduce来操作hbase的优化

    (1)scan.setCacheBlocks(false); 初始化map任务    TableMapReduceUtil.initTableMapperJob 本次mr任务scan的所有数据不放在缓 ...

  2. 微信群的id

    今天网速慢了,竟然把微信群的id卡出来了,记录一下. 格式应该是一个像QQ群一样的数字,然后+@chatroom 看图!   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论.

  3. Unix 网络编程 I/O 模型 第六章

    前提,也是重点是, 当接收收据.或者读取数据时,分两步 1 等待数据准备好. 2 从内核拷贝数据到进程. 对于一个network IO 即 socket(这里我们以read举例),它会涉及到两个系统对 ...

  4. js 回调函数 精析

      UpdateTime--2018年9月13日16点51分 1.什么是回调函数? 在JavaScript中,回调函数具体的定义为: 函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行 ...

  5. linux下php添加cur/soapl扩展

    注意:在不同的扩展路径下 ./configure --help 的帮助信息不尽相同 1.跟php一起安装 下载 http://curl.haxx.se/download/ curl 取较低的版本 wg ...

  6. CDH quick start VM 中运行wordcount例子

    需要注意的事情: 1. 对于wordcount1.0 ,按照http://www.cloudera.com/content/cloudera/en/documentation/HadoopTutori ...

  7. Android虚拟键盘弹出时挡住EditText解决方法

    在manifest的activity节点使用 Xml代码   <activity android:windowSoftInputMode="adjustResize"/> ...

  8. FFmpeg + SDL2 实现的视频播放器「视音频同步」

    文章转自:http://blog.csdn.net/i_scream_/article/details/52760033 日期:2016.10.8 作者:isshe github:github.com ...

  9. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  10. 关于对象映射(Dto->model) 思路的一些想法

    最近粗浅的学习了下AutoMapper 这个做对象映射的第三方工具,觉得非常方便使用,所以简单的总结了一下我能想到的简单的对象映射的方式. 占时先不考虑源对象成员到目标对象成员的指定映射(即成员名不一 ...