assert函数应用

Posted misterxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了assert函数应用相关的知识,希望对你有一定的参考价值。

1 assert概念

??函数名:assert
??头文件:#include<assert.h>
??函数原形:void assert( int expression )

2 assert作用

??assert的作用是先计算expression表达式的值,如果计算结果为真,继续运行下面的程序;如果计算结果为假,则程序终止运行。
??assert函数主要是检测程序的未知错误。比如对指针操作时指针是否为NULL;某个变量是否符合预定范围等等

3 assert用法

3.1 检测调用者传过来的指针参数是否正常

void test(int* p)
{
    assert(p != NULL);//用来判断调用者传过来的指针参数是否为空
    /*函数体*/
}
延伸:上面判断指针是否为空,前提条件是
1 定义指针时就要初始化为NULL,比如`int* p = NULL;`;
2 释放指针变量后也要把指针赋值为NULL,比如:
```
free(p);
p = NULL;
```

3.2 判断某个变量的范围

void test()
{
    int i = 0;
    /*
    *对i的相关操作,假设i小于32为有效范围
    */
    assert(i < 32);
    /*继续关于i的操作*/
}

??关于assert的使用,可以根据自己的需要使用在程序任何地方,用来检测程序的异常。但是,过多的使用asser函数,频繁调用会非常影响程序的性能,增加额外的开销。
??在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include<stdio.h>
#define NDEBUG
#include<assert.h>

3.3 assert只检验一个地方

??同时检验多个条件,如果出现断言错误,不能分辨出是哪个条件判断错误,比如:

//错误
assert(i < 32 && i + temp < i_max);
//正确
assert(i < 32);
assert(i + temp < i_max);   

3.4 不能使用改变环境的语句

??因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

//错误
assert(i++ < 32);

??这是因为如果出错,比如在执行之前i=32,那么这条语句就不会执行,那么i++这条命令就没有执行。

//正确
assert(i < 32);
i++;

??assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

参考:assert()函数用法总结

以上是关于assert函数应用的主要内容,如果未能解决你的问题,请参考以下文章

PHP 之 assert()函数

如何整合_测试那种genserver?正确使用assert_receive?

assert_option()可以用来对assert()进行一些约束和控制

assert_param函数的用法

Linux 内核线程调度示例一 ① ( 获取线程调度策略 | 断言 assert | 代码示例 )

WebShell代码分析溯源(第2题)