有哪些可用的开源C ++静态分析工具?[关闭]


301

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

可以使用商业C ++静态分析产品。尽管拥有这样的产品很棒,但对学生来说成本太高了,通常很难获得试用版。

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

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

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

一些相关的链接。


商业的DMS软件再造工具,可处理Java,C,C ++和COBOL,提供解析,AST构建,名称/类型解析,控制/数据流分析,自定义分析和转换。参见语义设计.com /产品/DMS/DMSToolkit.html
Ira Baxter

1
对于商用工具,还有CppDepend(cppdepend.com),也许试用版对学生来说足够了。

Answers:


21

Oink是在Elsa C ++前端之上构建的工具。Mozilla的猪肉是Elsa / Oink的叉子。

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


1
我一生中已经编译了1000多个程序,但是出于对上帝的爱,无论如何我都无法编译此程序包。我尝试使用Fedora,Ubuntu,WSL,Cygwin,MSYS2,Windows-但没有。总是缺少某些东西,文档简直糟透了。不要误会我的意思,我认为该工具非常出色。但是该网站和文档似乎在10到15年内没有人碰过。
阿帕奇(Apache)

73

CppCheck是开源和跨平台的。

Mac OSX:

brew install cppcheck

1
@gio我个人还没有看到任何问题。我相信CppCheck可以忽略或排除某些路径或文件,这有助于缩小范围。
秀伟

1
在Windows上:choco install cppcheck
KindDragon 2015年

53

关于GNU编译器,gcc已经有一个内置选项,可以对-Wall 发出警告。该选项是-Weffc ++,它违反了Scott Meyers在他的著作《Effective and More Effective C ++》中发布的某些准则。

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

  • 为具有动态分配的内存的类定义一个复制构造函数和一个赋值运算符。
  • 在构造函数中,初始化优先于赋值。
  • 在基类中使析构函数虚拟。
  • 让“ operator =“返回对* this的引用。
  • 当您必须返回对象时,请勿尝试返回引用。
  • 区分增量和减量运算符的前缀和后缀形式。
  • 切勿重载“ &&”,“ ||”或“,”。

7
除gcc的-Wall和-Weffc ++外,-Wextra还执行一些良好的免费静态分析,例如,分支不返回值,或检查unsigned小于零。令人惊奇的是,专业程序员经常认为后者是一个好主意……
Flash Sheridan

24
呸,-Weffc++发出警告是在一个大的代码库完全正常的构造。不过,我赞同的建议-Wextra。不要没有它就离开家!
汤姆(

29

目前正在开发中,但是clang可以进行C分析,并且可以随时处理C ++。它是LLVM项目的一部分。

更新:尽管着陆页上显示“分析器是一个连续的在进行中的产品”,但现在它已被记录为C和C ++的静态分析器。

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

编译器选项:-fsyntax-only


1
LLVM是一个非常有趣的项目,与gcc相比,它可以在更短的时间内生成经过优化的二进制文件。和叮当响,将成为其前端...
Nicola Bonelli,

另一个编辑器在-fsyntax-only开关上添加了信息。请注意,本质上这是运行分析程序的要求,即编译器将在不实际编译的情况下运行该分析程序,并发出警告。我不确定,但是我认为这与静态分析有所不同。
Don Wakefield

17

有人提到-Weffc ++,但这实际上是我默认未打开的仅有的GCC警告之一。但是,我打开的警告集是工具包中最重要的静态分析工具。您可以看到建议警告完整列表

综上所述:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wologic-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或其他版本,则可能需要从列表中删除它们。



7

如果说开源真的是“免费”,那么Microsoft的快速分析是不错的选择。当然只有Windows。它完全集成在Visual Studio和编译器中。例如:

cl /analyze Sample.cpp

该版本有哪些版本?
twk

似乎是内置于编译器中的,它是免费的。集成可能只是Team版本。
JBR威尔金森


4

夹板似乎填补了C的账单。

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

Mac OSX:

brew install splint

2
但是对于一个开发人员来说却很昂贵:)我更喜欢自由
罗伯特·古尔德

6
夹板适用于C,而不适用于C ++。我不知道他们是否打算扩大覆盖范围。希望如此!
哈罗德·班福德

是的,pclint值得一试,它在unix中的对应部分称为flexe-lint,9.0版必须比8.x版更快,9.0版还支持预编译头文件以加快分析速度。驯服pc-lint需要花费时间,它具有假阳性,如果您不能有选择地忽略它,可能会给您带来麻烦。
zhaorufei 2012年

3

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

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


PREFast将大大减慢您的构建过程,对于任何实际项目,您的构建服务器可能负担不起。
zhaorufei 2012年

@zhaorufei:大多数静态分析并非“快速”;从定义上讲,他们要做的代码分析工作非常复杂。如果您不总是喜欢构建成本,只需将其设置为可选。
Ira Baxter 2014年

2

我们一直在开发一个称为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/

进一步说明

度量器静态分析C ++源代码并生成软件度量。指标作为Codan检查器实现。可以在单独的视图中浏览分析结果。每个度量都有可配置的属性(例如,“每个功能的最大代码行数”的阈值)。超过这些阈值将报告问题,并在源代码编辑器中创建标记。

使用度量工具,您可以:

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

当前,度量者具有以下度量:

  • McCabe(复杂性)
  • 每种类型的传出耦合
  • 逻辑源代码行
  • 每种类型的成员数
  • 每个功能的参数数

1

您应该尝试oo-browser,它与xemacs集成得非常好


1

还可以用MELT(一种用于扩展GCC的领域特定语言)或G的C插件(难度更大)编写GCC扩展的代码,以进行一些自定义分析。


2
阅读过一份关于MELT并使用melt扩展gcc的PDF文件,我的感觉是,将自己的插件添加到gcc仍然太复杂/困难。对于普通用户而言并不实用。
zhaorufei 2012年

1
扩展GCC十分复杂,无论您采用哪种方式(通过C插件,通过MELT甚至通过Python)。这是因为GCC很复杂。并且自定义任何 C ++静态分析工具都很困难,因为C ++语言规范非常复杂,并且您将需要处理大部分复杂性(任何不平凡的C ++程序都使用了很多C ++功能,也许是通过C ++标准库) 。
Basile Starynkevitch 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.