关于编码风格:有哪些开源C ++静态分析工具可用?

What open source C++ static analysis tools are available?

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

可以使用商业C ++静态分析产品。虽然拥有这样的产品很棒,但是学生的成本太高,而且通常很难获得试用版。

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

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

  • C ++检查http://sf.net/projects/cppcheck/
  • Oink http://danielwilkerson.com/oink/index.html
  • C和C ++代码计数器http://sourceforge.net/projects/cccc/
  • 夹板(来自答案)
  • Mozilla的猪肉(来自答案)(现在是Oink的一部分)
  • Mozilla的Dehydra(来自答案)
  • 使用选项-Weffc++表示GNU g ++(来自答案)

什么是其他任何人都知道并可以推荐的便携式开源C ++静态分析工具?

一些相关链接。

  • https://stackoverflow.com/questions/97454/c-static-code-analysis-tool-on-windows
  • http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
  • http://www.chris-lott.org/resources/cmetrics/
  • 一个免费的工具,根据一组编码标准检查C / C ++源代码?
  • http://spinroot.com/static/
  • 选择静态代码分析工具


CppCheck是开源和跨平台的。

Mac OSX:

1
brew install cppcheck


关于GNU编译器,gcc已经有一个内置选项,可以为-Wall的那些启用额外的警告。选项是-Weffc ++,它是关于违反Scott Meyers在他的书"有效和更有效的C ++"中发表的一些指导原则。

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

  • 为具有动态分配的内存的类定义复制构造函数和赋值运算符。
  • 首选初始化为构造函数中的赋值。
  • 在基类中使析构函数虚拟化。
  • 让"operator ="返回对* this的引用。
  • 必须返回对象时,请勿尝试返回引用。
  • 区分增量和减量运算符的前缀和后缀形式。
  • 永远不要超载"&&","||"或","。


目前正在开发中,但clang做了C分析,并且随着时间的推移有针对性地处理C ++。它是LLVM项目的一部分。

更新:当着陆页显示"分析仪是一个持续的工作进行中"时,它现在被记录为C和C ++的静态分析器。

问题:如何运行GCC / Clang进行静态分析? (仅限警告)

编译器选项:-fsyntax-only


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

请参阅:http://danielwilkerson.com/oink/index.html


其他人提到了-Weffc ++,但这实际上是我默认情况下没有打开的唯一GCC警告之一。但是,我打开的警告集是我的工具包中最重要的静态分析工具。您可以看到推荐警告的完整列表。

综上所述:

-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或其他内容,则可能需要从列表中删除它们。


John Carmack还在这篇关于"静态代码分析"的有趣博客文章中提到了PVS-Studio。


如果通过开源,你真的意味着"免费",那么微软的早期分析是一个很好的分析。 Windows仅限课程。它完全集成在Visual Studio和编译器中。例如。:

1
cl /analyze Sample.cpp


Mozilla的静态分析工作可能值得一看。


Splint似乎填补了C的账单。

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

Mac OSX:

1
brew install splint


Windows驱动程序工具包中也提供了Microsoft的PREFast。可以在此处下载7.0版。

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


我们一直致力于一个名为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 ++源代码并生成软件度量。度量标准实现为
Codan跳棋。可以在单独的视图中探索分析结果。每
metric具有可配置属性(例如,'每行代码最大行数的阈值
功能')。超过这些阈值将报告问题并创建标记
在源代码编辑器中。

使用公制,您可以:

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

目前,公制者具有以下指标:

  • McCabe(Cyclomatic Complexity)
  • 每种类型的EfferentCoupling
  • 代码的逻辑源代码行
  • 每种类型的成员数量
  • 每个功能的参数数量


人们还可以在MELT(用于扩展GCC的领域特定语言)或GCC插件(更难)中编写GCC扩展来进行一些自定义分析。


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


Doxygen进行一些控制流分析并生成图表。那些可能不是你想要的,但我认为它们很有用。