我如何告诉 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 组合。
谢谢大卫和德鲁。
我们在 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 组合。
谢谢大卫和德鲁。