c++ - 如何使用 cppcheck 处理半相对包含路径

标签 c++ c++17 static-analysis cppcheck

我们的 C++ 项目被组织在几个模块(== 子文件夹)中,头文件放在 .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 版)有这方面的问题并且不正确
  • 解析头文件中定义的宏 -> 错误投诉正确代码
  • 发现类成员初始化的问题(例如 MyClass::MyClass() : _foo(_foo) {} )-> 没有关于错误代码的投诉

  • 当提供-I src在 cppcheck CLI 中,可以正确识别宏并发现上述实际问题,但分析时间从 开始飙升2 到 20 分钟 .

    我怀疑,通过 -I 再次提供整个源代码,这些文件都被重新解析为头文件。不幸的是,我没有具体的 include/我可以在这里使用的子文件夹。这里有什么建议?我已经在使用多个工作:-j 4 .

    最佳答案

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

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

  • 为了解决性能问题(我在 CI 中运行作业,而 20 分钟是我宁愿花在执行自动化测试上的很多时间),我做了以下事情:
  • 减少检查的配置--max-configs=5
  • 通过 --cppcheck-build-dir=CppcheckBuildDir 使用增量检查

  • 要将其集成到我们的 Gitlab CI 中,我必须缓存此目录:
      cache:
        paths:
          - CppcheckBuildDir
    

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

    关于c++ - 如何使用 cppcheck 处理半相对包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60264915/

    相关文章:

    c++ - `List' 不是模板

    C++ libCurl : Post callback function to send more than one byte

    c - memset 导致数组下溢,如何检测

    c - 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    c++ - 读取文件夹中的所有文件,然后将每个文件及其匹配项放入新的 Excel 文档中。 C++ 有可能吗?

    c++ - Qt3D 应用程序在按下任何按钮时触发系统声音

    c++ - 定义用 const int 绑定(bind)的数组不起作用

    c++ - 在 c++20 中删除了默认构造函数的聚合初始化

    c++ - 指向局部变量生命周期结束后的指针的编译时比较

    java - 从抽象语法树中查找变量/方法引用