【问题标题】:How can I tell cppcheck to ignore inline assembly?如何告诉 cppcheck 忽略内联汇编?
【发布时间】:2018-01-16 08:14:47
【问题描述】:

我们在 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-抑制 unreadVariable 在每一行之前,但最好只告诉 cppcheck 跳过整个内联汇编部分。

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

【问题讨论】:

  • 看来您应该可以使用-D-U。如果您将您的 asm 包装在 #ifndef cppcheck 中,那么我希望 -Dcppcheck 跳过它。
  • @DavidWohlferd 谢谢。真的很明显 - 只见树木不见森林。

标签: inline-assembly cppcheck


【解决方案1】:

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

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

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

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

谢谢大卫和德鲁。

【讨论】:

  • 从未使用过 cppcheck,我只是在猜测。但这似乎是合理的。也就是说,我很惊讶 cppcheck 没有为此目的“预定义”的符号。
  • 这帮助我标记(并一分为二)导致 cppcheck 崩溃的代码块。替代方案对解决这个特定问题没有帮助。 -U 选项是救生员。它甚至没有很好的记录cppcheck.sourceforge.io/manual.pdf
  • -D 的替代方案将是 #ifdef WITH_ASM 或其他东西,而您在正常构建中 -DWITH_ASM 但不是使用 cppcheck。这可能不太好,因为这意味着您需要额外的选项才能使代码可用。除非您在某些标题中包含所有内容中的 #ifndef __CPPCHECK__ / #define WITH_ASM / #endif,否则您可以拥有标准的#ifdef / #endif 栅栏,而不会分散前面的#define 的注意力。 (@alfC)
  • @PeterCordes,谢谢。对于二等分代码(我别无选择),在文件顶部执行#define EXCLUDE_CPPCHECK(我知道这是有问题的),-UEXCLUDE_CPPCHECKcppcheck 命令中,如(通过cmake)和#ifdef EXCLUDE_CPPCHECK / @987654337 @ 围绕有问题的代码(例如一个非常大的类)对我来说就足够了,而不会干扰正常编译的选项。
【解决方案2】:

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

--suppress=<spec>

抑制特定警告。 &lt;spec&gt; 的格式为:[error id]:[filename]:[line][filename][line] 是可选的。 [error id] 可能是 * 以禁止所有警告(针对指定的文件)。 [filename] 可能包含通配符 *?

--suppressions-list=<file>

抑制文件中列出的警告。每个抑制都是上面&lt;spec&gt;的格式。

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

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

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


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

以上选项在第 11 页。

【讨论】:

  • 我想过,但不幸的是它对我不起作用。我不想完全禁用对该文件的检查,只针对内联汇编部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多