首页 > 系统相关 >(转载)Linux C 中断言assert()使用简介

(转载)Linux C 中断言assert()使用简介

时间:2022-12-18 21:34:52浏览次数:78  
标签:语句 断言 ++ 简介 Linux assert 使用 pvTo

assert()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句,它的作用是终止程序以免导致严重后果,同时也便于查找错误

所需头文件:#include <assert.h>

报告错误的条件:assert(0);

void assert(
int expression
);

参数:Expression (including pointers) that evaluates to nonzero or 0.(表达式【包括指针】是非零或零)

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

void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
byte *pbTo = (byte *) pvTo; // 防止改变pvTo 的地址
byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom 的地址
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;

return pvTo;
}

assert() 用法总结:

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只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在。

assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销

在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

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

何时需要使用断言

  • 1.可以在预计正常情况下程序不会到达的地方放置断言:ASSERT( FALSE );
  • 2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
  • 3.使用断言测试方法执行的前置条件和后置条件
  • 4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

什么地方不要使用断言

断言语句不是永远会执行,可以屏蔽也可以启用

因此:

1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值


版权声明:本文为CSDN博主「zqixiao_09」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zqixiao_09/article/details/51417555

标签:语句,断言,++,简介,Linux,assert,使用,pvTo
From: https://www.cnblogs.com/arisskz6/p/16990984.html

相关文章

  • MongoDB从入门到实战之MongoDB简介
    前言相信很多同学对MongoDB这个非关系型数据库都应该挺熟悉的,在一些高性能、动态扩缩容、高可用、海量数据存储、数据价值较低、高扩展的业务场景下MongoDB可能是我们......
  • 使用 udev 高效、动态地管理 Linux 设备文件(转载)--2
    清单6.简单说明键值对的例子KERNEL是匹配键,NAME和MODE是赋值键。这条规则的意思是:如果有一个设备的内核设备名称为sda,则该条件生效,执行后面的赋值:在 ​​/dev​​下......
  • 添加Udev规则,让Linux自动挂载U盘(转载)
    如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在......
  • 工作流管理系统参考模型简介
    在阐述工作流引擎之前,我们来了解一下工作流技术的基本知识。早在几年前,为了建立工作流管理系统的相关标准,国际上成立了一个称为“工作流管理联盟”(简称WFMC)的国际组织。她提......
  • 《鸟哥的Linux私房菜-基础学习篇》读书笔记
      写在前面嗯,来这边实训,青软的孔老师给装了一个有Linux系统的虚拟机,讲了一些Linux的常识,决定去看这本书,了解一些Linux的知识 .加油生活^_^,嗯,希望以后的生活不会枯燥......
  • ARM Neon 简介
    “ARMAdvancedSIMD”,nick-named,itprovides:    (1)、Asetofinterestingscalar/vectorinstructionsandregisters(thelatteraremappedtothesamechi......
  • Linux学习资料
    国内的专业Linux网站​​ChinaUnix​​:创办于2001年,是一个以讨论Linux/Unix类操作系统技术、软件开发技术、数据库技术和网络应用技术等为主的开源技术社区网站。 ​​Li......
  • python中将assert断言放在try except中,失败断言运行后的结果也会是成功
    问题:将assert语句放进tryexcept中,用例执行后,哪怕断言失败,最后pytest返回的结果也是成功的,这样就无法判断哪些用例失败,哪些用例成功解决方法:在except代码中,添加raise,将异常......
  • 【AI with ML】第 5 章 :自然语言处理简介
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • Linux之特殊符号(通配符,重定向,引号)
    特殊符号:三剑客日志处理系统-特殊符号引号系列;重定向符号系列; 引号:引号:单引,双引,反引,不加引号,4种引号系列,对Linux大部分命令通用,四剑客单独记忆与使用;......