如何使用 cppcheck 处理 semi-relative 包含路径

How to handle semi-relative include paths with cppcheck

我们的 C++ 项目分为多个模块(== 子文件夹),header 位于 .cpp 文件旁边:

CMakeLists.txt
src
│
└───folder1
│   │
│   └───subfolder1
│       │   MyClass1.h
│       │   MyClass1.cpp
│       │   ...
│   
└───folder2
│   │
│   └───subfolder2
│       │   MyClass2.h
│       │   MyClass2.cpp
│       │   ...

包含指令总是相对于文件夹 src 而不是相对于代码文件定义的,例如在 MyClass1.cpp:

#include "folder1/subfolder1/MyClass1.h" // even the own header is defined semi-relatively
#include "folder2/subfolder2/MyClass2.h"

MyClass1::MyClass1() {
// some code
}

我最近注意到 cppcheck(版本 1.89)在这方面有问题并且不正确

向 cppcheck CLI 提供 -I src 时,可以正确识别宏并发现上述实际问题,但分析时间从 2 分钟飙升至 20 分钟

我怀疑,通过 -I 再次提供整个源代码,文件都是 re-parsed 作为 header 文件。不幸的是,我没有可以在这里使用的特定 include/ 子文件夹。这里有什么建议?我已经在使用多项工作:-j 4.

经过进一步调查,这实际上可能不是一个有效的问题:

  1. 我手动获取所有头文件并将它们复制到一个单独的文件夹:find . -type f \( -iname \*.h -o -iname \*.inl -o -iname \*.hpp \) -exec cp --parents \{\} ./../__cppcheckWorkaroundInclude \; 然后我通过 -I 将其提供给 cppcheck
  2. 检查仍然需要 20 分钟,所以我认为 cppcheck 错误地扫描了太多的假设是无效的 - 实际上需要这么长时间,因为它有很多代码。
  3. 所以向 cppcheck 提供 -I __cppcheckWorkaroundInclude-I src 并没有什么不同——至少我没有观察到。 意思是,-I 按预期工作

为了解决性能问题(我 运行 CI 中的作业,20 分钟是很多时间,我宁愿花在执行自动化测试上),我做了以下操作:

  • 减少检查的配置--max-configs=5
  • 通过--cppcheck-build-dir=CppcheckBuildDir
  • 使用增量检查

要将其集成到我们的 Gitlab CI,我必须缓存此目录:

  cache:
    paths:
      - CppcheckBuildDir

并且在 cppcheck 调用之前,必须创建目录(但带有 -p 标志,因为目录可能已经存在,从缓存中获取!):

mkdir -p CppcheckBuildDir