`
xitonga
  • 浏览: 587319 次
文章分类
社区版块
存档分类
最新评论

断言的实现方法

 
阅读更多

本文给出断言的两种实现方法,非原创,出处参考他处。


1. 利用结构体或数组的大小非负特性

/* Force a compilation error if condition is false, but also produce a result
 * (of value 0 and type size_t), so it can be used e.g. in a structure
 * initializer (or wherever else comma expressions aren't permitted). */
/* Linux calls these BUILD_BUG_ON_ZERO/_NULL, which is rather misleading. */
#define STATIC_ZERO_ASSERT(condition) (sizeof(struct { int:-!(condition); })    )
#define STATIC_NULL_ASSERT(condition) ((void *)STATIC_ZERO_ASSERT(condition)    )
 
/* Force a compilation error if condition is false */
#define STATIC_ASSERT(condition) ((void)STATIC_ZERO_ASSERT(condition))

在上面#define中,struct {int:-!(condition);},当断言的条件为假时,!(condition)为真(>0),-!(condition)<0,因为结构体的位域大小不可能为负值,则在编译时会出错。

比如,我们要保证一个数k<65535,则

STATIC_ASSERT(k < 65535)


参考:http://blog.jobbole.com/16035/


2. 调用断言处理函数的方法

将下面的代码放到某个全局头文件中,其中声明了assert_failed函数,
/**
 * @brief  The assert_param macro is used for function's parameters check.
 * @param  expr: If expr is false, it calls assert_failed function
 *   which reports the name of the source file and the source
 *   line number of the call that failed. 
 *   If expr is true, it returns no value.
 * @retval None
 */
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
  extern void assert_failed(uint8_t* file, uint32_t line);

在.c文件中提供assert_failed的实现

/**
 * @brief  Reports the name of the source file and the source line number
 *         where the assert_param error has occurred.
 * @param  file: pointer to the source file name
 * @param  line: assert_param error line source number
 * @retval None
 */
void assert_failed(uint8_t* file, uint32_t line)
{
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
	printf("Wrong parameters value: file %s \
	        on line %d\r\n", file, line);

    /* Infinite loop */
    while (1)
    {}
}

使用也非常简单,在assert_failed的while(1)死循环处设置断点,

代码中使用

assert_param(k < 65535);
当断言出错,则程序将停在死循环处,并在stdout打印出出错的文件及行数。


参考:TI的STM32F103库函数




分享到:
评论

相关推荐

    python 实现selenium断言和验证的方法

    今天小编就为大家分享一篇python 实现selenium断言和验证的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Junit测试Void方法

    Junit通常用于那些有明确返回值的方法的测试,而无法对返回值是void类型的方法进行测试,因为Junit的assert断言方法只适用于预期值与实际值的比较,对于void类型的方法,我们无法从它的return语句获得具体的返回值。...

    Python selenium实现断言3种方法解析

    主要介绍了Python selenium实现断言3种方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    SQL server中实现断言

    关于实现在SQL server中涉及多个表或聚集操作的比较复杂的完整性约束的方法 最近学习数据库系统概论,遇到了一个问题,查了好久没有解决,请教老师后才了解到在SQL server中要在触发 器中定义涉及多个表或聚集操作的...

    论文研究-程序断言动态检测工具的设计与实现.pdf

    重点研究了断言的动态检测方法与检测过程,并在关系数据库理论的基础上实现了交互式的断言动态检测工具,即TDDPA。该工具具有动态检测程序断言等功能,并通过将运行轨迹收集到数据库中来实现检测到的各种断言形式...

    Python unittest单元测试框架及断言方法

    一个Test Case实例是一个测试用例,完整的测试流程包括测试前准备环境的搭建(setUp)、实现测试过程的代码(run)、以及 测试后环境的还原(tearDown)。 (2)Test Suite Test Suite用来组装单个测试用例,可以...

    嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法

    今天小编就为大家分享一篇关于嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    如何在postman测试用例中实现断言过程解析

    Respomse body:Contains string断言方法 (Respomse body:Contains string为包含断言,只要在结果中包含我们填写的字符,执行就是通过的) 1.选择Tests,在图片右下加选择Respomse body:Contains string的断言方法...

    Pytest+allure+jsonpath+requests接口自动化测试工具,支持sql断言,数据依赖,测试数据隔离

    自定义扩展方法: 在用例中使用自定义方法(如:获取当前时间戳...)的返回值 接口录制:录制指定包含url的接口,生成用例数据 用例跳过:支持表达式、内置函数、调用变量实现条件跳过用例 动态多断言: 可(多个)动态...

    22-09-11-070_Nop_4.40.4(单元测试)定义实现

    在程序开发中测试和单元测试是两种不同的操作... nopCommerce程序单元测试定义实现是在Nunit框架的基础上进行定义实现的,断言操作是通过第3方法中间件FluentAssertions成员方法,而非Nunit框架的内置的断言成员方法。

    visible-assertions:JUnit断言的替代方案,可为您的测试提供更深入的日志描述

    Visible Assertions被设计用来代替标准的JUnit Assert类,从而提供了许多核心assert*方法的实现。 每个方法都带有一个附加参数,开发人员可以使用该参数来确切描述断言正在检查的内容。 关键区别在于,每个断言还...

    assert, 在库和业务模型中,使用瘦断言库.zip

    assert, 在库和业务模型中,使用瘦断言库 assert 一个简单的php库,它包含在业务模型中输入验证( 不过滤)的断言和保护方法。 库可以用于在输入数据上实现 pre-/post条件。思想是减少在模型中实现断言的代码量,同时...

    Python接口测试结果集实现封装比较

     接口测试执行完后,我们需要进行断言,断言的主要目的是用代码来判断实际结果和预期结果是否一致,这跟手工测试中用肉眼去判断是一样的思路。既然这样,我们可以将已知的预期结果和未知的实际结果简单的封装成一个...

    基于c++实现自动扫雷小程序源码(带说明介绍)课程大作业.zip

    具体通过"断言"机制,每当trywarn()方法无法点开新的格子,就通过getasserts()方法生成"断言"。每个周围有未点开格子的格子生成一个"断言"。 每个"断言"携带该格子数字减去周围已预警雷数及周围未点开格子位置信息...

    断言:断言以很好的错误消息验证方法的输入输出

    Webmozart断言 该库包含有效的断言,以测试方法的输入和输出。 使用这些断言,可以大大减少编写安全实现所需的编码量。 如果失败,则类中的所有断言都会引发\InvalidArgumentException 。常问问题什么区别? 该库受...

    C语言接口与实现 c语言

    这里我所提到的是一种基于接口与其实现的设计方法,并且通过对24个接口及其实现的描述详细地演示了这种方法,这些接口涉及到计算机领域的很多知识,其中包括数据结构,算法,字符串处理 和并发程序,这些实现并不...

    程序断言动态检测工具的设计与实现* (2009年)

    重点研究了断言的动态检测方法与检测过程,并在关系数据库理论的基础上实现了交互式的断言动态检测工具,即TDDPA。该工具具有动态检测程序断言等功能,并通过将运行轨迹收集到数据库中来实现检测到的各种断言形式...

Global site tag (gtag.js) - Google Analytics