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

Unset define in cppcheck analyze from cmake generated command

我有一个用 cppcheck 1.90 检查的项目,但我想取消设置一些定义,因为检查所有定义需要很多时间。

示例:tests.cpp

int main() {
  int x,y;
#ifdef A
  x = 5;
#else
  x = 10;
#endif

#ifdef B
  y = 5;
#else
  y = 10;
#endif

#ifdef C
  y = 5*x;
#else
  y = 10*x;
#endif

  int c = x+y;
}

当我在没有项目的情况下处理文件时 - 没有问题:

cppcheck ../tests.cpp --force -UB
Checking ../tests.cpp ...
Checking ../tests.cpp: A...
Checking ../tests.cpp: C...

我取消设置定义 B - 并且 cppcheck 不使用 B 检查编译路径。 但是如何使用 cmake 项目生成的文件呢?

cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cppcheck --project=./compile_commands.json --force -UB
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: B...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...

如我所见,cppcheck 被忽略了“-U”键。在这种情况下有什么方法可以取消定义吗?

为测试示例添加 cmakefile:

CMakeLists.txt
cmake_minimum_required(VERSION 3.6)

project(tests)

set(SRC
    tests.cpp
)

set(NAME test)
add_executable(${NAME} ${SRC})

可能的决定之一是更改 CMakeLists 文件(取消设置定义):

cmake_minimum_required(VERSION 3.6)
project(tests)
set(SRC
    tests.cpp
)
set(CMAKE_CXX_FLAGS "-UB=1")
set(NAME test)
add_executable(${NAME} ${SRC})

输出为:

$ cmake ../ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-- Configuring done
-- Generating done
-- Build files have been written to: /home/builder/bugs/test_cppcheck/build
$ cppcheck --project=./compile_commands.json --force
Checking /home/builder/bugs/test_cppcheck/tests.cpp ...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: A...
Checking /home/builder/bugs/test_cppcheck/tests.cpp: C...

没有“B”路径检查。 但是,如果存在不更改 CMakeLists 的解决方案 - 会更好。

您可以选择只编辑一次 CMakeLists 文件并根据需要传递参数,为此您应该

In the CMakeLists file add:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} *hard_coded_flags*")

Command line :

从命令行调用 cmake 时添加 CMAKE_CXX_FLAGS = -UB=1(或任何其他 cppcheck 标志),这会将 -UB=1 连接到hard_coded_flags.

另一种方法是cmake 运行 cppcheck本身。这可以通过设置 CMAKE_CXX_CPPCHECK 来完成(参见 documentation)。您可以在 CMakeLists.txt 中设置 CMAKE_CXX_CPPCHECK,也可以在调用 cmake.

的 command-line 中设置它

这确实有一些缺点(例如,每个源文件都是单独检查的,所以 cross-file 检查不起作用)。

但是有几个优点:

  • 无需单独调用 cppcheck
  • 如果您在 CMakeLists.txt 中设置 CMAKE_CXX_CPPCHECK,您还可以添加 cppcheck command-line 选项来控制它的作用。在您的情况下,您可以添加 -UB.
  • 这有助于将有关如何构建和检查项目的所有知识封装到一个文件中 (CMakeLists.txt)。

我通常在 CMakeLists.txt:

中遵循类似这样的模式
option(ENABLE_CODE_ANALYSIS "Run code analysis" OFF)
if(ENABLE_CODE_ANALYSIS)
    find_program(cppcheck cppcheck)
    message(STATUS "cppcheck    ${cppcheck}")
    if(NOT (cppcheck MATCHES "NOTFOUND"))
        set(CMAKE_CXX_CPPCHECK "${cppcheck}"
            "--enable=all"
            "--inconclusive"
            "--inline-suppr"
            "--quiet"
            "--suppress=missingInclude"
            "--suppress=unmatchedSuppression"
            "--suppress=unusedFunction"
            "--template='{file}:{line}: warning: {id} ({severity}): {message}'")
    endif()
endif(ENABLE_CODE_ANALYSIS)

然后就可以通过cmake -DENABLE_CODE_ANALYSIS=ON.

进行代码分析了