The differences between assert , TRACE, ASSERT, VERIFY

今天在路上遇见一个朋友,他急忙地问我关于断言assert的作用,原来他是要去参加面试。关于assert, TRACE, ASSERT, VERIFY这几个宏,以前在编程的时候总结过一些它们的用法,使用的时候比较简单,但是要详细完整地说出它们的作用还是查一下资料好。下面是查阅的一些资料将其整理如下:( 欢迎大家指正:) )



From:《高质量程序设计指南——C++/C语言(第3版)》P.116

如何使用断言(assert)?


断言(assert)的语义如下:如果表达式的值为0(假),则输出错误消息并终止程序的执行(一般还会出现提示对话框,说明在什么地方引发了

assert);如果表达式为非0(真),则不进行任何操作。因此断言失败表明程序存在一个bug。


C++/C的宏assert(expression)就是这样的断言,当表达式为假时,调用库函数abort()终止程序。

程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用(感觉这种解释有点儿多余)。由于assert(expression)的宏体全部被条件编译伪指令#ifdef _DEBUG和#endif所包含,因此assert()只能在Debug版本里有效。


assert不是一个仓促拼凑起来的宏。为了不在程序的Debug版本和Release版本中造成差别,assert不应该带来任何副作用。所以assert不是函数,而是宏。(这句话不太理解,难道是函数就有差别吗?)


程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。所以不要把程序中的assert语句删除掉。


[note 1]:
如果程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用函数出了差错,(这句话好像也不太准确,觉得表述为,如果出现了assert错误,说明assert(expression)中的expression为FALSE,这样理解容易些)。assert可以帮助我们(程序员)追踪到错误发生的原因。


[note 2]:
在函数的入口处,建议使用assert来检查参数的有效性(合法性)。
例如:
内存拷贝函数memcpy,如果assert的expression为假,那么程序就会中止。这样就可以检查程序对memcpy()的调用是否正确。


[note 3]:
请给assert语句加注释,告诉人们assert语句究竟要干什么。


[note 4]:
要注意assert语句仅仅在Debug版本中才有效,而在Release版本中无效。使用assert的目的是捕捉在运行时不应该发生的非法情况(而不是错误情况)。什么是错误情况?

例如:
用malloc返回NULL,动态内存申请失败不是非法情况,而是错误情况。所以我们要用if语句主动捕捉错误情况并给出错误处理代码,而不应该使用assert,否则在Release版本中失效。


[note 5]:
一般教科书都鼓励程序员们进行防错程序设计,但要知道这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用assert进行报警。


[note 6]:
要区分assert和跟踪语句tracer的不同。tracer是指一些用于报告程序执行过程中当前状态的输出语句,相当于printf的作用,但输出的不一定是bug。


[note 7]:
程序通过了assert的检查,并不保证就万无一失了。

例如:

memcpy()中的assert,如果给它传入了两个未初始化的野指针(wild pointer,地址不为0但是没有指向合法的内存块),那么assert()就失去了作用。(所以,我们程序员在使用函数之前,应该避免一些非法操作)


[note 8]:
ASSERT宏中应该包含的元素:判断条件、输出当前断言失败的位置(文件、行数等)、返回错误、终止程序...


[note 9]:
几种典型的ASSERT的写法。


简要概括


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值