全部文档
概述 硬件支持 快速开发指南 内核 驱动 通用组件 专业组件 常见问题

断言


简介

assert()断言,用于在调试过程中捕捉程序的错误。一般格式为assert(expression)

断言函数,用于在调试过程中捕捉程序的错误。

“断言”在语文中的意思是“断定”、“十分肯定地说”,在编程中是指对某种假设条件进行检测,如果条件成立就不进行任何操作,如果条件不成立就捕捉到这种错误,并打印出错误信息,终止程序执行。

assert() 会对表达式expression进行检测: 如果expression的结果为 0(条件不成立),那么断言失败,表明程序出错,assert() 会向标准输出设备打印一条错误信息,并调用 abort() 函数终止程序的执行。 如果expression的结果为非 0(条件成立),那么断言成功,表明程序正确,assert() 不进行任何操作。

要打印的错误信息的格式和内容没有统一的规定,这和标准库的具体实现有关(也可以说和编译器有关),但是错误信息至少应该包含以下几个方面的信息:

  • 断言失败的表达式,也即expression;
  • 源文件名称;
  • 断言失败的代码的行号。

OneOS提供了以下两种断言方式:

  • 标准格式断言:OS_ASSERT(condition)
  • 带额外提示信息的断言OS_ASSERT_EX(condition, fmt, ...)

OS_ASSERT

标准格式断言,定义如下:

#define OS_ASSERT(condition)                                                                                \
do                                                                                                          \
{                                                                                                           \
    if (!(condition))                                                                                       \
    {                                                                                                       \
        os_kprintf("Assert failed. Condition(%s). [%s][%d]\r\n", #condition, __FUNCTION__, __LINE__);       \
        while(1)                                                                                            \
        {                                                                                                   \
            ;                                                                                               \
        }                                                                                                   \
    }                                                                                                       \
} while (0)

当断言中的条件为假时,会打印出错的函数名、行号以及断言的内容,然后进入死循环。

OS_ASSERT_EX

带提示信息的断言主要用来判断与设计预期是否相符,并且可以添加自己的提示信息,定义如下:

#define OS_ASSERT_EX(condition, fmt, ...)                                                                   \
    do                                                                                                      \
    {                                                                                                       \
        if (!(condition))                                                                                   \
        {                                                                                                   \
            os_kprintf("Assert failed. " fmt " [%s][%d]\r\n", ##__VA_ARGS__, __FUNCTION__, __LINE__);       \
            while (1)                                                                                       \
            {                                                                                               \
                ;                                                                                           \
            }                                                                                               \
        }                                                                                                   \
    } while (0)

当断言中的条件为假时,会打印出错的错误提示信息、函数名、行号以及断言的内容,然后进入死循环。

results matching ""

    No results matching ""