关于C语言的assert(断言)

1、assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

2、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>

3、一些建议:

3.1、使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
3.2、在函数的入口处,使用断言检查参数的有效性(合法性)。
3.3、在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
3.4、一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

4、一个例子:

char   *   clone_string(const   char   *   source)

{

char   *   result;

assert(source   !=   NULL);

result   =   (char   *)malloc(strlen(source)   +   1);

if   (result   !=   NULL)

{

strcpy(result,   source);

assert(strcmp(result,   source)   ==   0);

}

return   result;

}

注意到我对source是否为NULL是用assert检查的,但对result是不是为NULL是用if语句判断的,这是因为在调用代码正确的情况下source必然不为NULL,如果断言失败,说明调用代码中有错误,需要修改;但result作为malloc的返回值则不一定,在malloc代码无误的情况下仍然可能返回NULL——当内存块不足时。最后又用assert对strcpy的结果进行检查,因为只要代码正确,无论什么情况strcpy应该正常完成复制,它没有malloc那种异常情况存在。

时间: 2024-08-02 11:30:35

关于C语言的assert(断言)的相关文章

ASSERT断言

ASSERT断言 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言.同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言. 代码执行之前必须具备的特性: assert是宏,而不是函数: 使用断言可以创建更稳定,品质更好且不易于出错的代码. 断言语句不是永远会执行,可以屏蔽也可以启用

Spring Assert断言工具类

Spring 中 org.springframework.util.Assert 类实现合法性检测,Assert的方法如下: 断言方法说明: 1. notNull(Object object)  当 object 不为 null 时抛出异常,notNull(Object object, String message) 方法允许您通过 message 定制异常信息.和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object

C++ ASSERT() 断言机制

C++ ASSERT() 断言机制 ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继续执行后面的语句.这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误. 原型定义: #include <assert.h> void assert( int expression_r_r_r ); assert的作用是现计算表达式 expres

Spring Assert断言 (方法入参检测工具类-断言)

Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理.举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理.这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测

在C语言中用ASSERT调试的八个技巧

C语言中的ASSERT(断言)宏是嵌入式软件开发人员可以使用的最好的调试工具之一.虽然ASSERT功能强大,但我很少看到它被实施,并且在一些使用它的案例中,它的实施要么是有瑕疵的要么是不正确的.以下一些技巧将不仅能够帮助阐明在何时.何地使用ASSERT,而且还能阐明如何开始正确使用它. 技巧1:记住ASSERT的定义 对许多开发人员来说,断言是一个令人困惑的话题,因为它们的许多使用方式与其设计初衷背道而驰.我见到的最清晰的断言定义是这样的: “断言是在程序某个特定点的一个布尔表达式,除非程序中有

python assert断言函数

python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常. self.assertEqual(a,b,msg=msg)   #判断a与.b是否一致,msg类似备注,可以为空 self.assertNotEqual(a,b,msg=msg)  #判断a与b是否不一致 self.assertTrue(a,msg=none)    #判断a是否为True self.asse

pytest自动化7:assert断言

前言:assert断言就是将实际结果和期望结果做对比,符合预期结果就测试pass,不符合预期就测试failed. 实例1:简单断言 实例1优化版--增加异常信息文字描述 异常断言 excinfo 是一个异常信息实例,它是围绕实际引发的异常的包装器.主要属性是.type. .value 和 .traceback 注意:断言type的时候,异常类型是不需要加引号的,断言value值的时候需转str ---------------------------------------------------

assert断言用法

使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助.本文主要是讲assert断言的基础知识. python assert断言的作用 python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达式为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假

Java中assert(断言)的使用

1.Eclipse中默认assert(断言)是关闭,开启方式如下: 简单来说:就是设置一下jvm的参数,参数是-enableassertions或者-ea(推荐). 2.assert格式 1.格式1 assert [boolean 表达式] 如果[boolean表达式]为true,则程序继续执行. 如果为false,则程序抛出AssertionError,并终止执行. 2.格式2 assert [boolean 表达式 : 错误表达式 (日志)] 如果[boolean表达式]为true,则程序继