【问题标题】:C++: Static analysis tools that will warn of missing headers [closed]C ++:将警告缺少标头的静态分析工具[关闭]
【发布时间】:2020-01-01 07:31:20
【问题描述】:

我正在使用 GCC 和 Clang 为多个平台编译一个大型项目。我遇到的问题是我在一个平台(Ubuntu 18.04)上完成了所有的错误修复和测试,甚至运行cppcheckclang-tidy 等静态工具来查找错误。作为错误修复的一部分,我什至尝试在 Ubuntu 上使用多个编译器进行编译,以确保代码已准备好发布。

但是,有几次我遇到了另一个系统上的开发人员由于缺少简单的包含而无法编译更新的问题。

最近的一个例子是我们引入了一些在 Ubuntu 上的 GCC 和 Clang 中经过大量测试的新功能。然后,MacOS 上的开发人员遇到了一些编译器错误,结果证明这是由于一个文件中缺少#include <array>,而另一个文件中缺少#include <sstream>。我的意思是,当您查看有问题的文件时,他们确实使用了arraysstringstreams,所以我明白了。但令我惊讶的是静态工具没有捕捉到这些错误。

那么我该如何解决这个问题呢?它们肯定是编程错误,而不是编译器错误,因为很明显我应该包含这些文件。

【问题讨论】:

    标签: c++ gcc clang c++14 static-analysis


    【解决方案1】:

    您正在寻找include-what-you-use。从他们的文档中:

    “包括你使用的东西”的意思是:对于你在foo.cc 中使用的每个符号(类型、函数变量或宏),foo.ccfoo.h 应该#include 一个.h 文件导出该符号的声明。

    自己编译并非易事,因为该工具的内部工作与 Llvm 内部紧密耦合。但是你可能很幸运能在你的发行版中找到一个预构建的包。不过,一旦你让它运行起来,它就不是灵丹妙药。它试图解决的问题很难,可能会有误报等。

    【讨论】:

    • 来自他们的文档的更多信息:“这是 alpha 质量软件 - 充其量(截至 2018 年 7 月)。” 上次我检查过这个工具时它不适合对于任何类型的现实世界项目:添加实现细节标头、错误的包含路径、随机包含顺序、死于循环包含。比 clang 格式还要糟糕。
    • 好吧,也许我们目前已经拥有最好的了?
    猜你喜欢
    • 2015-10-28
    • 2023-03-14
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多