繁体   English   中英

如何为汇编语言内联函数使用解决 MISRA C 错误?

[英]How to use resolve MISRA C error for assembly language inline function?

我在 PIC32 MCU C 代码中使用与编译器相关的汇编语言函数 asm()。 我的代码在我的 C 代码中只使用 asm("reset") 函数就可以编译并正常工作。检查 MISRA 合规性时,我收到以下 MISRA 错误:

函数 'asm' 未声明,假定返回 int [MISRA 2012 Rule 17.3,强制]asm("reset");

asm("reset");

如何解决此汇编语言函数的 MISRA 错误? 我也尝试创建函数宏来使用它,但仍然出现错误。

函数 'asm' 未声明,假设返回 int [MISRA 2012 Rule 17.3,强制]ASM_RESET(void);

#define ASM_RESET(void) asm("reset")
ASM_RESET(void);

看起来 PC-Lint 没有将asm识别为关键字。 它把它当作一个没有原型的函数。 您可以尝试将+rw(asm)添加到选项中。

另一方面,这个论坛帖子建议合法的方法是在仅包含程序集的独立文件中定义reset函数,并为 C 文件显示它的原型。

重置.c:

void reset(void) {
   asm("reset");
}

测试.c:

#include "reset.h"

...
reset();

asm是编译器扩展关键字,而不是函数。 由于编译器特定,它不会被您的静态分析工具自动识别,并且您的编译器的内联汇编语法是“类函数”,因此它应用了函数原型规则。

您需要使用描述编译器实现定义行为的配置文件或命令行选项来正确配置 PC-Lint。 这可能包括很多选项,但在这种情况下,您应该使用:

-dasm()=  

这将导致分析器忽略具有类似函数语法asm(...)

或者,您可以在静态分析期间通过有条件地定义一个隐藏所有此类指令的宏来忽略内联汇编器语法:

#if defined _lint
    #define asm( asmstr )
#endif

然而,这会隐藏检查器的其他偏差,例如有关内嵌装配的封装和隔离的规则。 出于这个原因,您不应该使用与 C 代码行混合的宏或内联程序集,而应该定义一个包装函数:

void reset(void) 
{
   asm("reset");
}

并将上面定义的reset()函数放在一个单独的翻译单元中,并简单地从分析中省略该源代码 - 就好像它是库代码一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM