关于c++中断言assert的说明 『转』
来源:互联网 发布:淘宝网怎么开店 编辑:程序博客网 时间:2024/06/05 18:08
关于c++中断言assert的说明 『转』
assert(条件) ;
如果条件不满足则会弹出对话框
技巧1
assert(条件&&"说明信息")
由于对话框中会显示条件,因此可以利用这个特点显示说明信息,帮助定位错误
技巧2
assert(!"说明信息")
因为assert(0)肯定会显示对话框,可以帮助提示程序运行到哪里了,常用在switch case中 对于不可能达到的default的说明和提示:
default: assert(!"should never get here!");
return -1;
技巧3
#define Assert(a,b) assert(a&&b)
定义一个Assert宏,可以更好的使用技巧1
技巧4
#define Assert(条件,"说明信息")
if(条件){_asm{int 3}} //满足条件中断
关于ASSERT 和 _ASSERTE头文件:
用法 :
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
解释 : 这两个宏具有更加丰富的调试功能。
你真的会使用assert吗?
写这篇博客源于在阅读lighttpd源代码是遇到的一个关于assert应用的疑问。
在阅读lighttpd源代码时,发现比比皆是的对malloc的调用结果进行assert检查,比如:Buffer.c:
buffer* buffer_init(void) { buffer *b; b = malloc(sizeof(*b)); assert(b); b->ptr = NULL; b->size = 0; b->used = 0; return b;}
这里的assert(b)似乎有问题,实际release版本在运行中难道不会发生malloc返回NULL的情况吗?之后在阅读《Writing Solid Code 》一书时找到了答案。
对assert的基本用法就不再累述了,下面总结一下assert的实际应用的Recommended practice吧:
1、要使用断言对函数参数进行确认
主要有以下情况:
- 指针不是NULL的断言;
- index值或size值不是负值或小于已知限值的断言;这一条也可以这么描述:要从程序中删去无定义的特性或者在程序中使用断言来检查出无定义特性的非法使用
2、每个断言必须在头文件中的函数功能描述的断言部分进行说明(不要浪费别人的时间 ─── 详细说明不清楚的断言 ),例如:
* Asserts: * 'size' is no greater then LIMIT. * 'format' is not NULL. * The function result is no greater than LIMIT. */
如果没有断言, 写 “Nothing”:
* Asserts: * Nothing */
(以上的格式也许严格了一些,不过如果真的这么做,对代码的可阅读性会很有帮助)
3、断言和错误校验的区别
正确使用断言,必须要清楚程序错误(program errors)和运行时错误(run- time errors)之间的区别;
- 一个程序错误是一个bug,永远不应该发生。
- 一个运行时错误是在程序运行的任何时候都可能会发生.
断言并不是一种处理运行时错误的机制。例如在需要输入正数的时候,用户输入了一个负数,如果用断言来检测这种情况就不是好的设计。对于这种情况需要用合适的错误检查和恢复处理的代码来进行处理。
再回到lighttpd中对malloc函数的返回值进行assert断言,我觉得也属于这个问题,这应该是一个运行时错误,而不是程序错误;所以,我觉得《C和指针》一书中对malloc返回NULL处理是通过一个错误检查分配器来处理的。
4、断言和bug
断言大致分为前置条件(Preconditions)、后置条件(Postconditions)、不变性条件(Invariants)
如果前置条件不成立,发生Assertion violations,则调用该函数的代码存在bug,需要尽快找到并解决;
如果后置条件不成立,发生Assertion violations,则(函数的)实现代码存在bug,需要尽快找到并解决;
例如:
void doBlah(int x){ assert(x!=0); ....}
这段代码说明这个函数的调用不可能传入参数0,如果发生这种情况,说明调用这个函数的代码存在bug;
以上是自己的一点理解,欢迎高手指正!!!
- 关于c++中断言assert的说明 『转』
- 关于C语言的assert(断言)
- 关于C语言的assert(断言)
- Node中自动化测试断言包assert的方法说明
- Node中自动化测试断言包assert的方法说明
- 关于assert断言的使用
- 关于ASSERT(断言)的作用
- Linux C 中断言assert()使用简介
- Linux C 中断言assert()使用简介
- C/C++assert 断言
- 关于ASSERT(断言)使用的规则
- 关于 assert断言 失效的问题
- C语言的assert断言宏
- c++assert断言
- C/C++ Assert 断言
- C-断言(assert)
- 【c++】assert断言
- Java中断言assert关键字的实现
- [Android]将应用崩溃信息汇报给开发者并重新启动应用
- Play FrameWork安装与开发
- Visual Studio 2012逆袭iPhone 5
- Excel.cpp和Excel.h
- 风尘中,忘了捡拾那日女子留下的胭脂
- 关于c++中断言assert的说明 『转』
- oracle游标
- 知识记录:string、wstring、cstring、 char、 tchar、int、dword转换方法
- 字符,字节和编码
- C++中的静态变量和函数
- shell之文本过滤(正则表达式)
- jacob简单调用word,execl(二)
- 编程: 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
- 关于我做openstack的报告的ppt分享