You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何标记嵌入式系统中不返回的函数?以System_Fail为例

标记不返回函数的标准与工具专属方式

1. 标准C语言(C11及以上)

C11标准引入了_Noreturn关键字,用于明确标记函数不会返回。同时标准库<stdnoreturn.h>提供了更简洁的noreturn宏(是_Noreturn的别名),写法如下:

#include <stdnoreturn.h>

noreturn void System_Fail(void);

noreturn void System_Fail(void)
{
    // 置设备于安全状态的代码
    while (1);
}

该标记会被符合C11标准的编译器、静态分析工具识别,避免误判函数会返回。

2. IAR Embedded Workbench专属标记

如果项目使用的IAR版本对C11支持有限,可以使用IAR的扩展关键字__noreturn:

__noreturn void System_Fail(void);

__noreturn void System_Fail(void)
{
    // 置设备于安全状态的代码
    while (1);
}

IAR编译器会识别该标记,不会生成函数返回相关的警告,同时也能将“不返回”的信息传递给Coverity等工具。

3. Coverity静态分析适配

除了依赖标准或编译器标记,还可以直接给Coverity明确提示:

  • 在函数内部死循环前添加__coverity_no_return();语句:
void System_Fail(void)
{
    // 置设备于安全状态的代码
    __coverity_no_return();
    while (1);
}
  • 或者使用Coverity提供的COVERITY_NORETURN宏标记函数声明:
#define COVERITY_NORETURN __attribute__((noreturn))

COVERITY_NORETURN void System_Fail(void);

4. 单元测试框架处理

针对单元测试框架的误判,可通过两种方式处理:

  • 在测试用例中,调用这类不返回函数后,添加框架专属的“终止测试”宏(比如Unity的TEST_IGNORE()或类似机制),避免框架执行后续无效代码。
  • 若框架支持,将函数标记为noreturn,让框架知晓调用后不会回到测试流程。

内容的提问来源于stack exchange,提问作者Thomas Matthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:54:58