CMake 中的 Cppcheck 支持

Posted

技术标签:

【中文标题】CMake 中的 Cppcheck 支持【英文标题】:Cppcheck support in CMake 【发布时间】:2018-02-05 15:06:54 【问题描述】:

我并不是在询问以某种方式支持 Cppcheck 的各种可用第三方模块。

在 CMake 3.10 中,CMake 似乎获得了一些官方的 Cppcheck 支持。见CMAKE_<LANG>_CPPCHECK。

不幸的是,如何使用这个变量的文档有点稀疏。有没有一个很好的例子说明 Cppcheck 应该如何与 CMake 3.10(或更高版本)一起使用?

【问题讨论】:

【参考方案1】:

simple example 将是 - 如果您的 PATH 中有 cppcheck 并且您没有指定其他参数 - 通过设置全局 CMAKE_&lt;LANG&gt;_CPPCHECK 变量如下:

cmake_minimum_required(VERSION 3.10)

project(CppCheckTest)

file(
    WRITE "main.cpp"
[=[
int main()

    char a[10];
    a[10] = 0;
    return 0;

]=] 
)

set(CMAKE_CXX_CPPCHECK "cppcheck")
add_executable($PROJECT_NAME "main.cpp")

要扫描的文件会自动添加到cppcheck 命令行。所以上面的例子给出了以下输出(Linux系统上的gcccppcheck):

# make
Scanning dependencies of target CppCheckTest
[ 50%] Building CXX object CMakeFiles/CppCheckTest.dir/main.cpp.o
Checking .../CppCheckTest/main.cpp...
Warning: cppcheck reported diagnostics:
[/mnt/c/temp/***/CppCheckTest/main.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.
[100%] Linking CXX executable CppCheckTest
[100%] Built target CppCheckTest

您可以在现有项目中尝试cppcheck,只需通过cmake 命令行设置CMAKE_CXX_CPPCHECK 变量:

# cmake -DCMAKE_CXX_CPPCHECK:FILEPATH=cppcheck ..

一个更“日常生活”的例子可能会让你在你的CMakeList.txt 中包含类似以下代码 sn-p 的内容:

find_program(CMAKE_CXX_CPPCHECK NAMES cppcheck)
if (CMAKE_CXX_CPPCHECK)
    list(
        APPEND CMAKE_CXX_CPPCHECK 
            "--enable=warning"
            "--inconclusive"
            "--force" 
            "--inline-suppr"
            "--suppressions-list=$CMAKE_SOURCE_DIR/CppCheckSuppressions.txt"
    )
endif()

参考文献

CMake Commit: Add properties to run cppcheck along with the compiler

&lt;LANG&gt;_CPPCHECK target property

仅当&lt;LANG&gt;CCXX 时才支持此属性。

指定一个包含cppcheck 静态分析工具命令行的;-list。 Makefile 生成器和 Ninja 生成器将与编译器一起运行 cppcheck 并报告任何问题。

如果在创建目标时设置了CMAKE_&lt;LANG&gt;_CPPCHECK 变量的值,则该属性将被初始化。

【讨论】:

感谢您的详细回答,不幸的是它在这里不起作用(Ubuntu 17.10,cppcheck 1.80 cmake 3.9.1。cppcheck 没有输出。如何调试这个? @arved 你确定这也适用于 CMake 3.9.x 吗?没有检查这个。我正在使用 CMake 3.10.x。我链接的提交是 5 个月大,所以我怀疑它只适用于 3.10.x(如果我查看 release notes 它是在 3.10 版中添加的)。 提供的“日常生活”示例不起作用(至少使用带有 CMake 3.12.4 的 Ninja 生成器)!似乎必须在 CLI 上完全指定 CMAKE_CXX_CPPCHECK。否则构建系统不会获取CMAKE_CXX_CPPCHECK 的值。通过在我的CMakeLists.txt 中手动将变量设置为CACHE 变量,我几乎可以正常工作,但即使如此,configure 也必须运行 两次 才能使用生成器获取更新的CMAKE_CXX_CPPCHECK 值。猜测:构建文件的写入顺序错误。恐怕唯一的可移植解决方案是自定义目标。 有趣的是,当使用并行作业 -jX 调用 make 时,cppcheck 输出是乱码且无法读取。 我也尝试过这个,但不适用于最新的 cmake 版本。 cppcheck 在 configure 中找到,但是当我构建 proejct 时,我没有得到任何 cppcheck 输出。有人有示例项目的链接吗?

以上是关于CMake 中的 Cppcheck 支持的主要内容,如果未能解决你的问题,请参考以下文章

带有空大括号的 C++ 新初始化触发 cppcheck uninitvar 错误

CMAKE 有条件地运行 cppcheck

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

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

cppcheck 中的 SLOC

支持qnx中的cmake??从 Linux 移植到 QNX