我如何告诉 cppcheck 忽略内联汇编?

How can I tell cppcheck to ignore inline assembly?

我们在 DSP 的内联汇编中有一个文件。 Cppcheck 认为程序集中有大量“变量已分配但未使用”行。

有什么方法可以让它跳过检查内联汇编部分吗?我在手册中看不到任何明显的东西,而且必须依次抑制每一行有点乏味(t

下面是一些违规行的示例。这是一个上下文保存例程。

inline assembly void save_ctx()
{
asm_begin
.undef global data saved_ctx; 
.undef global data p_ctx;  
asm_text
    ...
    st XM[p0++], r0;
    st XM[p0++], r1;    
    st XM[p0++], r2;    
    st XM[p0++], r3;    
    st XM[p0++], r4;    
    st XM[p0++], r5;    
    st XM[p0++], r6;   
    ...

我可以关闭消息 // cppcheck-抑制未读变量 在每一行之前,但最好只告诉 cppcheck 跳过整个内联汇编部分。

我有什么办法可以做到这一点,还是我们只能接受很多重复的评论?

根据手册页(我自己没试过),您可以添加命令行选项:

--suppress=<spec>

Suppress a specific warning. The format of <spec> is: [error id]:[filename]:[line]. The [filename] and [line] are optional. [error id] may be * to suppress all warnings (for a specified file or files). [filename] may contain the wildcard characters * or ?.

--suppressions-list=<file>

Suppress warnings listed in the file. Each suppression is in the format of <spec> above.

即在你的情况下 --suppress=unreadVariable:all_dsp_asm_*.cpp 并为那些特定文件完全切换它。哪个是IMO可用的,因为你可以把所有的DSP inline asm东西放在单独的文件中,所以它不会影响你的普通cpp检查。

或者在最坏的情况下使用抑制列表列表文件,我猜你可能会在其中列出荒谬的特定行,以覆盖整个内联部分。

我没有看到如何在源代码中内联它,看起来它可能只影响单行。


可能正在检查 manual here 的更新版本,您也可以通过 -i<filename>(第二页)排除整个文件。

以上选项在第 11 页。

有点违反直觉,但感谢@DavidWohlferd 为我指出了正确的方法。

-D__CPPCHECK__没有做正确的事。它告诉 cppcheck only 检查带有 __CPPCHECK__ 或没有定义的块,即它完全关闭组合检查。然而,使用 -U 有一个简单但违反直觉的解决方案。

包裹方块
#define EXCLUDE_CPPCHECK
#ifdef EXCLUDE_CPPCHECK
...
#endif  // EXCLUDE_CPPCHECK

现在,如果您使用 -UEXCLUDE_CPPCHECK 调用 cppcheck,它将跳过该块(即使 #define 就在它之前!),但仍执行 #if 中使用的所有其他 #define 组合。

谢谢大卫和德鲁。