用于某些目标的 Cppcheck 与 CMake 集成

Posted

技术标签:

【中文标题】用于某些目标的 Cppcheck 与 CMake 集成【英文标题】:Cppcheck integration with CMake for SOME targets 【发布时间】:2021-07-29 12:32:46 【问题描述】:

我想不通的是,如果我有一个 CMake 项目,其子文件夹包含自己的 CMakeLists.txt 和自己的目标: 我想为特定目标而不是所有目标集成 Cppcheck。 那么在这种情况下,我需要在根 CMakeLists.txt 中包含什么以及子文件夹的 CMakeLists 中会发生什么变化?

【问题讨论】:

这个问题没有通用的答案。 Cmake 不定义或鼓励任何类型的特定文件组织或项目相互交互的方式。 @user7860670 虽然只是为了 cppcheck,但我是否需要制作自定义目标?我这样做的方式是将参数附加到 CMAKE_CXX_CPPCHECK 但并不真正成功 【参考方案1】:

为您想要检查的每个目标设置<LANG>_CPPCHECK 目标属性,并从您不想使用 cppcheck 检查的每个目标中清除它。


以下 CMakeLists.txt 文件:

cmake_minimum_required (VERSION 3.11)
project(test)
file(WRITE a.c "int main()  int a[10]; a[10] = 0; ")
file(WRITE b.c "int main()  int b[10]; b[10] = 0; ")
file(WRITE c.c "int main()  int c[10]; c[10] = 0; ")
file(WRITE a.h "static inline void f()  int a[10]; a[10] = 0; ")
file(WRITE b.h "static inline void f()  int b[10]; b[10] = 0; ")
file(WRITE c.h "static inline void f()  int c[10]; c[10] = 0; ")
add_executable(a a.c a.h)
add_executable(b b.c b.h)
add_executable(c c.c c.h)
set(cppcheck
  cppcheck
  "--enable=warning"
  "--inconclusive"
  "--force" 
  "--inline-suppr"
)
set_target_properties(a PROPERTIES C_CPPCHECK $cppcheck)
set_target_properties(b PROPERTIES C_CPPCHECK $cppcheck)

导致只检查a.cb.c文件,不检查c.c文件。

$ cmake -S. -B_build -GNinja ; cmake --build _build
-- The C compiler identification is GNU 11.1.0
-- The CXX compiler identification is GNU 11.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /dev/shm/.1000.home.tmp.dir/10/_build
[3/6] Building C object CMakeFiles/b.dir/b.c.o
Checking ../b.c ...
../b.c:1:26: error: Array 'b[10]' accessed at index 10, which is out of bounds. [arrayIndexOutOfBounds]
int main()  int b[10]; b[10] = 0; 
                         ^
[4/6] Building C object CMakeFiles/a.dir/a.c.o
Checking ../a.c ...
../a.c:1:26: error: Array 'a[10]' accessed at index 10, which is out of bounds. [arrayIndexOutOfBounds]
int main()  int a[10]; a[10] = 0; 
                         ^
[6/6] Linking C executable a

【讨论】:

这是有道理的,我试过了;但是,如果我想执行cppcheck --project=compile_commands.json,它仍然会在我忽略的目标中输出样式问题。所以我不确定是什么覆盖了这个 what's overriding this 如果您指定--project 选项和cppcheck,那么它将使用项目文件中指定的文件。 好吧我明白了..所以我想我唯一的选择是在执行这个命令时忽略带有-i的文件..或者我可以创建一个可以执行后期构建但仍然只能执行的自定义目标检查我想要的目标,而不必像前者那样手动忽略文件(如果你认为它可行的话)...... PS:我坚持在构建后也运行 cppcheck 是出于 CI 目的 我不明白。不要指定--project=compile_commands.json。 |无论如何,虽然有一些 cppcheck 与 cmake 集成,但有时“还不够”。如果是,确实为 cppcheck(和其他静态检查器)编写单独的工作管道。 I want without having to manually ignore files like the former 您可以让 cmake 在目标中存储文件列表,然后使用它为 cppcheck 生成参数。确实可能作为单独的 cmake 自定义目标。

以上是关于用于某些目标的 Cppcheck 与 CMake 集成的主要内容,如果未能解决你的问题,请参考以下文章

CMAKE 有条件地运行 cppcheck

Cppcheck Cmake 集成:基于警告中止构建

从 cmake 生成的命令中取消设置 cppcheck 分析中的定义

如何在 CMake 中隐藏某些目标?

如何使用 cppcheck 忽略某些文件类型?

如何告诉 cppcheck 忽略某些错误?