【问题标题】:What open source C++ static analysis tools are available? [closed]有哪些开源 C++ 静态分析工具可用? [关闭]
【发布时间】:2010-09-13 13:54:08
【问题描述】:

Java 有一些非常好的开源静态分析工具,如FindBugsCheckstylePMD。这些工具易于使用、非常有用、可在多个操作系统上运行并且免费

提供商业 C++ 静态分析产品。虽然拥有这样的产品很棒,但对于学生来说成本太高了,而且通常很难获得试用版。

另一种方法是寻找可以在多个平台(Windows 和 Unix)上运行的开源 C++ 静态分析工具。通过使用开源工具,可以对其进行修改以满足某些需求。找到这些工具并非易事。

以下是其他人发现或建议的 C++ 静态分析工具的简短列表。

有哪些其他便携式开源C++静态分析工具大家都知道并且可以推荐?

一些相关链接。

【问题讨论】:

  • 商业、DMS 软件再造工具,处理 Java、C、C++ 和 COBOL,提供解析、AST 构建、名称/类型解析、控制/数据流分析、自定义分析和转换。见semanticdesigns.com/Products/DMS/DMSToolkit.html
  • 对于商业工具,还有 CppDepend (cppdepend.com),也许试用版对学生来说已经足够了。

标签: c++ coding-style static-analysis


【解决方案1】:

CppCheck 是开源和跨平台的。

Mac OSX:

brew install cppcheck

【讨论】:

  • @gio 我个人没有看到任何问题。我相信 CppCheck 有能力忽略或排除某些路径或文件,这有助于缩小范围。
  • 在 Windows 上:choco install cppcheck
【解决方案2】:

关于 GNU 编译器,gcc 已经有一个内置选项,可以在 -Wall 的基础上启用额外的警告。选项是 -Weffc++,它违反了 Scott Meyers 在他的著作“Effective and More Effective C++”中发表的一些准则。

该选项特别检测以下项目:

  • 为具有动态分配内存的类定义复制构造函数和赋值运算符。
  • 在构造函数中更喜欢初始化而不是赋值。
  • 在基类中将析构函数设为虚拟。
  • 让“operator=" 返回对 *this 的引用。
  • 当你必须返回一个对象时,不要试图返回一个引用。
  • 区分递增和递减运算符的前缀和后缀形式。
  • 切勿重载“&&”、“||”或“,”。

【讨论】:

  • 除了 gcc 的 -Wall 和 -Weffc++ 之外,-Wextra 还做了一些很好的免费静态分析,例如,不返回值的分支,或检查无符号是否小于零。专业程序员认为后者是个好主意的频率令人惊讶……
  • 呸,-Weffc++ 警告 tons 的构造在大型代码库中完全没问题。不过,我赞同-Wextra 的建议;没有它就不要离开家!
【解决方案3】:

目前正在开发中,但clang 会进行 C 分析,并且目标是随着时间的推移处理 C++。它是LLVM 项目的一部分。

更新:虽然登录页面显示“分析器是一个持续的工作进行中”,但它现在是 documented 作为 C 和 C++ 的静态分析器。

问题:How can I run GCC/Clang for static analysis? (warnings only)

编译器选项:-fsyntax-only

【讨论】:

  • LLVM 是一个非常有趣的项目,与 gcc 相比,它可以在更短的时间内生成更多优化的二进制文件;完成后,clang 将成为它的前端......
  • 另一个编辑器添加了关于 -fsyntax-only 开关的信息。请注意,它本质上是一个运行分析的请求,编译器将在没有实际编译的情况下运行,并发出警告。我不确定,但我认为这与静态分析不同。
【解决方案4】:

Oink 是一个建立在 Elsa C++ 前端之上的工具。 Mozilla 的 Pork 是 Elsa/Oink 的一个分支。

见:http://danielwilkerson.com/oink/index.html

【讨论】:

  • 我这辈子编译过1000+程序,但看在上帝的份上,无论如何我都编译不了这个包。我尝试使用 Fedora、Ubuntu、WSL、Cygwin、MSYS2、Windows - 但没有。总是缺少一些东西,文档简直太糟糕了。不要误会我的意思,我想这个工具很棒。但是网站和文档看起来在 10 到 15 年内没人碰过它们。
【解决方案5】:

其他人提到了 -Weffc++,但这实际上是我默认不打开的唯一 GCC 警告之一。但是,我打开的一组警告是我工具包中最重要的静态分析工具。你可以看到complete list of recommended warnings

总结:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs - Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused

请注意,其中一些需要新版本的 gcc,因此如果您卡在 4.5 或其他版本上,您可能需要将它们从列表中删除。

【讨论】:

    【解决方案6】:

    John Carmack 在这个有趣的blog post on "Static Code Analysis" 中也提到了PVS-Studio

    【讨论】:

    • 它既不是“开源”,也绝对不是“免费”。它是众所周知的静态分析工具(我认为它的覆盖率仅次于它),但它的价格相当高。
    【解决方案7】:

    如果说开源,你的意思是“免费”,那么微软的prefast 分析是一个很好的分析。当然,仅限 Windows。它完全集成在 Visual Studio 和编译器中。例如:

    cl /analyze Sample.cpp
    

    【讨论】:

    • 这适用于哪个版本和版本?
    • 好像是编译器内置的,是免费的。集成可能仅限团队版。
    【解决方案8】:

    Mozilla's static analysis work 可能值得一看。

    【讨论】:

      【解决方案9】:

      Splint 似乎为 C 买单。

      如果您没有指定开源,我会说 Gimpel SoftwarePCLint 可能是 C++ 中用于静态代码检查的最佳工具之一。但是,当然,它不是开源的。

      Mac OSX:

      brew install splint
      

      【讨论】:

      • 但是对于单个开发者来说很昂贵 :) 我更喜欢免费
      • 夹板用于 C,而不是 C++。我不知道他们是否打算扩大覆盖范围。希望如此!
      • 是的,pclint值得一试,它在unix中的对应部分叫做flexe-lint,9.0版本必须比8.x版本快,9.0版本还支持预编译头来加速上分析。驯服 pc-lint 需要时间,它有误报,如果你不能选择性地忽略它,可能会给你带来麻烦。
      【解决方案10】:

      Microsoft 的PREFast 也可用于 Windows 驱动程序工具包。 7.0版可here下载。

      Microsoft 文档声明它应该只针对驱动程序代码运行,但是这个(旧的)blog post 列出了运行它的步骤。也许它可以集成到正常的构建过程中?

      【讨论】:

      • PREFast 会大大减慢您的构建过程,对于任何真正的项目,您的构建服务器可能负担不起。
      • @zhaorufei:大多数静态分析并不“快”;根据定义,他们有一项非常复杂的代码分析工作要做。如果您一直不喜欢构建成本,只需将其设为可选即可。
      【解决方案11】:

      我们一直在开发一个名为 metriculator 的 Eclipse CDT 插件。它仍在开发中,但一些主要指标(例如 LSLOC、McCabe、EfferentCoupling)已经实现。

      有关视频演示和文档等更多详细信息,请参阅http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation

      最新的夜间版本可通过更新站点安装:http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

      进一步说明

      Metriculator 静态分析 C++ 源代码并生成软件指标。指标实现为 科丹跳棋。可以在单独的视图中探索分析结果。每个 指标具有可配置的属性(例如,“每条代码的最大行数”的阈值 功能')。超过这些阈值将报告问题并创建标记 在源代码编辑器中。

      使用度量器,您可以:

      • 分析 C++ 文件/文件夹/项目
      • 使用 Codans 首选项页面定义指标阈值并启用/禁用指标
      • 在源代码编辑器中有问题标记
      • 探索指标结果
      • 将指标结果导出为标签云(通过更新站点作为可选功能提供)

      目前 metriculator 带有以下指标:

      • McCabe(圈复杂度)
      • 每种类型的传出耦合
      • 逻辑源代码行
      • 每种类型的成员数
      • 每个函数的参数数量

      【讨论】:

        【解决方案12】:

        你应该试试 oo-browser 它与 xemacs 的集成很棒

        【讨论】:

          【解决方案13】:

          您还可以使用MELT(一种专为扩展 GCC 设计的领域特定语言)或 C 中的 GCC 插件(更难)编写 GCC 扩展代码来进行一些自定义分析。

          【讨论】:

          • 已经阅读了一篇关于 MELT 和用 melt 扩展 gcc 的 PDF,我的感觉是向 gcc 添加自己的插件仍然太复杂/困难。对于普通用户来说不是实用的方法。
          • 扩展 GCC 是很复杂的,不管你怎么做(通过 C 插件,通过 MELT 甚至通过 Python)。这是因为 GCC 很复杂。并且自定义any C++ 静态分析工具困难,因为 C++ 语言规范非常复杂,您需要处理大部分复杂性(任何重要的 C++ 程序使用了很多 C++ 特性,也许是通过 C++ 标准库)。
          【解决方案14】:

          Doxygen 进行一些控制流分析并生成图表。这些可能不是您想要的,但我发现它们很有用。

          【讨论】:

            猜你喜欢
            • 2010-12-13
            • 2010-10-06
            • 1970-01-01
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            • 2010-11-05
            • 2010-10-12
            相关资源
            最近更新 更多