如何标记嵌入式系统中不返回的函数?以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
相关产品推荐
相关产品推荐

