2017-08-08 145 views
2

我们在一个DSP内联汇编中有一个文件。 Cppcheck认为程序集中存在“变量赋值但未使用”行的负载。如何告诉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,抑制unreadVariable ,但它会更好,只是告诉cppcheck跳过整个内联汇编部分。

有什么办法我可以做到这一点,或者我们只需要接受大量的重复评论?

感谢,

伊恩

+2

看起来像你应该能够使用'-D'或'-U'。如果你在'#ifndef cppcheck'中包装你的asm,那么我希望'-Dcppcheck'跳过它。 –

+0

@DavidWohlferd谢谢。真的很明显 - 看不到树木。 –

回答

2

有点违反直觉的,但由于@DavidWohlferd指着我的正确途径。

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

缠上

#define EXCLUDE_CPPCHECK 
#ifdef EXCLUDE_CPPCHECK 
... 
#endif // EXCLUDE_CPPCHECK 

现在,如果你调用cppcheck与-UEXCLUDE_CPPCHECK它会跳过该块(即使指令#define之前它!),但仍然做的#define的所有其他组合的块,在#if中使用。

谢谢大卫和德鲁。

+1

从来没有使用cppcheck,我只是猜测。但这似乎是合理的。这就是说,我很惊讶cppcheck没有一个它为此目的而预先定义的符号。 –

2

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

--suppress=<spec> 

中的特定警告。 <spec>的格式是:[error id]:[filename]:[line][filename][line]是可选的。 [error id]可能是*以禁止所有警告(对于指定的一个或多个文件)。 [filename]可能包含通配符*?。文件中列出的

--suppressions-list=<file> 

禁止警告。每种抑制的格式为上面的<spec>

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

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

我不明白如何在源代码中内联它,看起来像它可能只会影响单行。


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

上面的选项是在第11页

+0

我想过,但不幸的是它不适合我。我不想完全禁用该文件的检查,只适用于内联汇编部分。 –