assert使用

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

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

请看下面的程序清单badptr.c:
#include <stdio.h>
#include
<assert.h>
#include <stdlib.h>

int main( void )
{
       FILE *fp;

    
       fp = fopen(
"test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件

       assert( fp
);                          
//所以这里不会出错
       fclose( fp );

    
       fp = fopen(
"noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败

       assert( fp
);                          
//所以这里出错
       fclose( fp
);                          
//程序永远都执行不到这里来

return 0;
}

[[email protected] error_process]# gcc badptr.c
[[email protected]
error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp‘ failed.

已放弃

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

用法总结与注意事项:
1)在函数开始处检验传入参数的合法性
如:

int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize
缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变    
nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <=
MAX_BUFFER_SIZE);

...
}

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好: assert(nOffset >= 0);
assert(nOffset+nSize <=
m_nInfomationSize);

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题
错误: assert(i++
< 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i
< 100)
         i++;

            

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

5)有的地方,assert不能代替条件过滤

assert使用,布布扣,bubuko.com

时间: 2024-10-25 06:06:50

assert使用的相关文章

[XCTF嘉年华体验赛](web)web2 assert函数

0x00 题目分析 浏览一遍页面,在about页面,获得如下信息 访问 .git/ ,页面存在. 使用githack扒下来.得到源码,进行代码审计. 分析得到: 1.flag在flag页面,要看源码才能看到. 2. 参数过滤了 ../ 也就是限定了只能在本目录 3. exists函数 对文件的存在进行判定. 0X01 解题思路 理清思路,要看源码,有哪几种方法. 1.系统命令执行,cat 等函数 2.函数执行,show_source 等 3.将文件打包 ,下载下来. 这里最有可能的就是函数执行了

Selenium2+python自动化56-unittest之断言(assert)

前言 在测试用例中,执行完测试用例后,最后一步是判断测试结果是pass还是fail,自动化测试脚本里面一般把这种生成测试结果的方法称为断言(assert). 用unittest组件测试用例的时候,断言的方法还是很多的,下面介绍几种常用的断言方法:assertEqual.assertIn.assertTrue 一.简单案例 1.下面写了4个case,其中第四个是执行失败的 # coding:utf-8import unittestclass Test(unittest.TestCase):   

junit4 assert类中的assert方法总结

junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类. 1.assertTrue/False([String message,]boolean condition);判断一个条件是true还是false.感觉这个最好用了,不用记下来那么多的方法名.2.fail([String message,]);失败,可以有消息,也可以没有消息.3.assertEquals([String message,]Object expected,Object actu

Appium 相关学习(二) testng中的Assert类

测试流程: 1.启动appium server.使用appium命令启动. 2.配置appium client.appium client的参数配置. 3.通过webdriver执行调用. 一.扩展AssertResult类 主要扩展功能,当断言失败时,自动截图保存,此时需要重写AssertResult的onAssertFailure方法,重写代码如下: public class AssertResult extends Assertion{ @Override public void onAs

C 语言assert使用

1.assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行. 2.使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销.在调试结束后,可以通过在包含#

assert 断言

断言表示为某些条件判断(多用逻辑语句),当需要测定或是确保在程序中表达式值为真.可以启用断言进行验证,因此可以在程序测试时启用断言,而在部署时禁用断言. 断言当遇到正确的判断和错误的判断时,会怎么响应. vim assert.c ./a.out * 当断言为假时,后续执行中断.

error C2065: &#39;assert&#39; : undeclared identifier

F:\VC6.0 : error C2065: 'assert' : undeclared identifier 导入#include <assert.h> error C2065: 'assert' : undeclared identifier

ASSERT函数

assert宏的原型定义在<assert.h>中,其作用是假设它的条件返回错误,则终止程序运行,原型定义:  #include <assert.h>  void assert( int expression );  assert的作用是现计算表达式 expression ,假设其值为假(即为0),那么它先向stderr打印一条出错信息,  然后通过调用 abort 来终止程序执行. http://www.chongtang.me/index.php/1419 提高程序健壮性之ass

断言(assert)和程序的安全保证

断言,用来DEBUG错误的,在DEBUG时发现然后跟踪错误! 通常 写一个程序给别人使用的,这个代码在安全性上的要求是什么呢?直觉上,我们都知道程序不应该崩.但是通常C/C++的程序如果把包含API的头文件暴露出来的话,根本没办法保证这一点.往往,如果一个C/C++的程序以头文件提供给别人使用的话,其安全性保证应该是"正确使用的时候一定不会崩,错误使用的时候尽最大可能的尽早崩".      我刚知道assert的时候把assert的作用和异常搞混淆了,我以为assert和异常用途一样,