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

311

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

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

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

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

还有哪些其他的便携式开源C++静态分析工具可以推荐?

一些相关链接。


商用的DMS软件重构工具包,可处理Java、C、C++和COBOL,提供解析、AST构建、名称/类型解析、控制/数据流分析、自定义分析和转换功能。请参见http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html。 - Ira Baxter
1
对于商业工具,还有CppDepend(http://www.cppdepend.com),也许试用版对学生来说已经足够了。 - Issam
clang-tidy 应该在列表中。 - Jesper Juhl
14个回答

74

CppCheck 是开源且跨平台的。

Mac OSX:

brew install cppcheck

1
@gio 我个人没有遇到过任何问题。我相信 CppCheck 有忽略或排除某些路径或文件的能力,这有助于缩小范围。 - Soo Wei Tan
2
在Windows上:choco install cppcheck - KindDragon

55

关于GNU编译器,gcc已经内置了一个选项,可以在-Wall的基础上增加额外的警告。该选项为-Weffc++,并涉及违反Scott Meyers在其书籍《Effective and More Effective C++》中发布的一些指导方针。

具体而言,此选项检测以下内容:

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

8
除了gcc的-Wall和-Weffc++之外,-Wextra还可以进行一些很好的免费静态分析,例如检查未返回值的分支或检查无符号数是否小于零。令人惊讶的是,专业程序员经常认为后者是个好主意... - Flash Sheridan
26
呸,-Weffc++ 警告了大量在大型代码库中完全正常的结构。我赞同使用 -Wextra,不要离开它! - Tom

29

1
LLVM是一个非常有趣的项目,与gcc相比,在更短的时间内生成更优化的二进制文件;而clang完成后,将成为其前端... - Nicola Bonelli
另一个编辑添加了关于-fsyntax-only开关的信息。只需注意,它本质上是一个请求,要求运行编译器在不实际编译的情况下运行的分析,并发出警告。我不确定,但我认为这与静态分析不同。 - Don Wakefield

20

3
我一生中编译了1000多个程序,但天哪,无论如何我都无法编译这个软件包。我尝试过使用 Fedora、Ubuntu、WSL、Cygwin、MSYS2、Windows等,但都失败了。总是会有些东西缺失,而且文档实在太糟糕了。别误会,我想这个工具本身很棒。但网站和文档看起来就好像10-15年没人碰过似的。 - Apache

19

有人提到了-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或类似版本,则可能需要从列表中删除它们。


14

4
这个工具既不是“开源”的,也完全不符合“免费”的任何含义。这是一个众所周知的静态分析工具(我认为仅次于Coverity),但它的价格相当高。 - Tomas Pruzina

7
如果您说的“开源”实际上是指“免费”,那么微软的prefast分析工具是一个不错的选择。当然,它只适用于Windows系统。它完全集成在Visual Studio和编译器中。例如:
cl /analyze Sample.cpp

这个版本和版本号是什么? - twk
似乎是内置于编译器中,而该编译器是免费的。集成可能仅适用于团队版。 - JBRWilkinson

6

4

Splint似乎是C语言的最佳选择。

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

Mac OSX:

brew install splint

2
但对于单个开发人员来说有点昂贵 :) 我更喜欢免费的。 - Robert Gould
6
Splint适用于C语言,不适用于C++。我不知道他们是否计划扩大覆盖范围。希望如此! - Harold Bamford
是的,PCLint值得一试,它在Unix中的对应版本称为Flexe-lint,9.0版本比8.x版本更快,9.0版本还支持预编译头以加速分析。你需要花时间来驯服Pc-lint,它有误报,如果你不能选择性地忽略它,可能会给你带来麻烦。 - zhaorufei

3

微软的PREFast也可以在Windows Driver Kit中使用。版本7.0可从这里下载。

微软文档指出它只能用于驱动程序代码,但是这篇(旧的)博客文章列出了运行它的步骤。也许它可以集成到正常的构建过程中?


PREFast会严重拖慢您的构建过程,对于任何真实项目而言,您的构建服务器可能无法承受它。 - zhaorufei
@zhaorufei:大多数静态分析工具都不是“快速”的,因为它们需要进行相当复杂的代码分析。如果你不喜欢每次都要付出构建成本,那就将其设置为可选项。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接