如何使用 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)在这方面有问题并且不正确
- 解决 header 文件中定义的宏 -> 关于正确代码的虚假投诉
- 发现 class 成员初始化的问题(例如
MyClass::MyClass() : _foo(_foo) {}
)-> 没有关于错误代码的投诉
向 cppcheck CLI 提供 -I src
时,可以正确识别宏并发现上述实际问题,但分析时间从 2 分钟飙升至 20 分钟。
我怀疑,通过 -I
再次提供整个源代码,文件都是 re-parsed 作为 header 文件。不幸的是,我没有可以在这里使用的特定 include/
子文件夹。这里有什么建议?我已经在使用多项工作:-j 4
.
经过进一步调查,这实际上可能不是一个有效的问题:
- 我手动获取所有头文件并将它们复制到一个单独的文件夹:
find . -type f \( -iname \*.h -o -iname \*.inl -o -iname \*.hpp \) -exec cp --parents \{\} ./../__cppcheckWorkaroundInclude \;
然后我通过 -I
将其提供给 cppcheck
- 检查仍然需要 20 分钟,所以我认为 cppcheck 错误地扫描了太多的假设是无效的 - 实际上需要这么长时间,因为它有很多代码。
- 所以向 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
我们的 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)在这方面有问题并且不正确
- 解决 header 文件中定义的宏 -> 关于正确代码的虚假投诉
- 发现 class 成员初始化的问题(例如
MyClass::MyClass() : _foo(_foo) {}
)-> 没有关于错误代码的投诉
向 cppcheck CLI 提供 -I src
时,可以正确识别宏并发现上述实际问题,但分析时间从 2 分钟飙升至 20 分钟。
我怀疑,通过 -I
再次提供整个源代码,文件都是 re-parsed 作为 header 文件。不幸的是,我没有可以在这里使用的特定 include/
子文件夹。这里有什么建议?我已经在使用多项工作:-j 4
.
经过进一步调查,这实际上可能不是一个有效的问题:
- 我手动获取所有头文件并将它们复制到一个单独的文件夹:
find . -type f \( -iname \*.h -o -iname \*.inl -o -iname \*.hpp \) -exec cp --parents \{\} ./../__cppcheckWorkaroundInclude \;
然后我通过-I
将其提供给 cppcheck - 检查仍然需要 20 分钟,所以我认为 cppcheck 错误地扫描了太多的假设是无效的 - 实际上需要这么长时间,因为它有很多代码。
- 所以向 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