本文是一个静态代码分析工具的清单,共有26个工具。包括4个.NET工具、2个Ada工具、7个C++工具、4个Java工具、2个JavaScript工具、1个Opa工具、2个Packaging工具、3个Perl工具、1个Python工具。
1.NET
.NET Compiler Platform(代号 Roslyn)
Roslyn提供有着丰富的代码分析API的开源C#和Visual Basic编译器。它可以使用这些Visual Studio里的API生成代码分析工具。
- 官网:https://roslyn.codeplex.com/
- GitHub:https://github.com/dotnet/roslyn
- Visual Studio博客介绍:
- https://blogs.msdn.microsoft.com/visualstudio/2011/10/19/introducing-the-microsoft-roslyn-ctp/
CodeIt.Right
CodeIt.Right提供一个快速的自动的方法确保你的源代码遵循预先定义的设计和风格准则。它通过以下方式使静态代码分析进入更高水平:即时代码审查、及早发现问题、编码原则、自动代码审查、集成StyleCop检查、报告。
FxCop
一个实现.NET静态代码分析的图形用户接口和命令行工具。
FxCop提供几百种规则实现各种类型的分析。包括:设计、全球化、互操作性、可维护性、灵活性、命名、性能、可移植性、可靠性、安全性,利用率。FxCop的功能完全集成到Visual Studio2010的高级版和最终版中。
- 最新版本:10.0
- 发布日期:2010年6月18日
- 官网:https://www.microsoft.com/en-us/download/details.aspx?id=6544
- GitHub:https://github.com/DrShaffopolis/FxCop
- 文档:https://msdn.microsoft.com/en-us/library/dd264939(v=VS.100).aspx
StyleCop
StyleCop分析C#源代码,强制执行一系列风格和一致性规则。可以在Visual Studio内部运行,也可以集成到MSBuild项目中。StyleCop还可以被集成到很多第三方开发工具中。
核心原则:
StyleCop通过为C#代码强制执行一组通用风格规则来体现价值。StyleCop将继续利用一个连续的带有允许的最小规则配置的规则集。开发者可以实现他们自己的规则,只要他们愿意。
StyleCop拥有和Visual Studio、MSBuild,TFS等无缝集成的能力。开发者可以自由执行自定义代码,将StyleCop集成到其他开发和工具环境,如SDK文档中所述。
- 最新版本:4.7.55
- 发布日期:2016年11月10日
- 官网:http://stylecop.codeplex.com/
- GitHub:https://github.com/StyleCop
2 Ada
AdaControl
AdaControl是一个免费的(授权)工具,可以检测Ada程序中使用的各种结构。它的首要目标是控制风格和程序规则的正确使用,但是它也可以作为一个强大的工具搜索编程风格或设计模式的各种形式。搜索的元素范围有非常简单的,比如某种实体、声明或语句的出现,也有非常复杂的,比如验证遵守了某种编程模式。
- 最新版本:1.18r9
- 发布日期:2016年11月10日
- 官网:http://www.adalog.fr/en/adacontrol.html
- Sourceforge:https://sourceforge.net/projects/adacontrol/
Fluctuat
Fluctuat是一抽象解释器,以数字编程(C或Ada)静态分析器为基础,由CEA-LIST的ME ASI(ModElling and Analysis of Systems in Interaction)实验室在2001年开发。给出一组输入和参数,可能带有不确定因素,它会考虑这个程序所有可能的行为,无论是真实的还是有限精度下,并描述这些不同的特性。
3 C,C++
BLAST
BLAST(Berkeley Lazy Abstraction Software verification Tool伯克利惰性抽象软件验证工具)是一个C语言静态软件验证工具,它可以解决可达性问题,例如是否可以通过一个有效的执行命令从入口点(主程序)到达给定的程序位置。
安全属性的验证可能降低到可达性,BLAST常常用于核查Linux驱动程序验证项目。
可以在以下网站下载Linux系统的BLAST源代码或二进制版本。
- 最新版本:2.7.2
- 发布日期:2014年2月17日
- 官网:http://forge.ispras.ru/projects/blast/
- 文件:http://forge.ispras.ru/projects/blast/files
- 版本库:http://forge.ispras.ru/projects/blast/repository
Cpplint
这个项目继续开发cpplint,它是一个C++风格检查器,遵循Google的C++风格指南。提供的cpplint 为PYPI(Python Package Index)包,并添加了几个功能和修复程序。它是google/styleguide的一个分支,希望未来可以合并在一起。
- 最新版本:1.3.0
- 发布日期:2016年7月13日
- 官网:https://pypi.python.org/pypi/cpplint
- GitHub:https://github.com/google/styleguide/tree/gh-pages/cpplint
Coccinelle
Coccinelle是一个程序匹配和转换引擎。它提供语意修补程序以便在C代码中指定期望的匹配和转换。Coccinelle初始的目的是完成Linux的间接开发。这种开发包括客户端代码中所需要的改变,目的是响应库应用程序接口变化。还可能包括一些修改,例如重命名一个函数、添加一个函数参数,它的值以某种方式被上下文决定、重组数据结构。除了间接开发,Coccinelle还可以成功的寻找和修复系统代码中的错误。
- 最新版本:1.0.6
- 发布日期:2016年9月27日
- 官网:http://coccinelle.lip6.fr/
- GitHub:https://github.com/coccinelle/coccinelle
Frama-C
Frama-C是一个平台,致力于分析用C语言写的源代码。
Frama-C集成几个分析技术到一个协作平台中。其包含一组提供核心功能的内核(例如一个C程序的抽象化语法树)和一组被称为插件的分析器。这些插件可以建立在平台中其他插件的计算结果之上。
归功于这个方法,Frama-C能提供一些复杂的工具,包括:
- 一个基于抽象解释器的分析器,旨在验证不存在运行时错误;
- 一个基于最弱前提运算的程序防护框架;
- 一个程序切片器;
- 一个验证临时特性的工具;
- 几个代码开发和相关性分析的工具。
这些插件共享常见的语言,可以通过ASCL(ANSI/ISO C Specification Language)特性交换信息,还可以通过它们的APIs集合信息。
- 最新版本:14.0
- 发布日期:2016年11月1日
- 官网:http://frama-c.com/
- GitHub:https://github.com/Frama-C/Frama-C-snapshot
- 教程:http://frama-c.com/acsl_tutorial_index.html
Lint
Lint实用程序尝试检测命名为C程序文件的功能,可能是错误,也可能是不可移植,或者是浪费。同时它也执行比C编译器更严格的类型检查。Lint实用程序运行C预处理器作为它的第一阶段,带有这个预处理器的标志“lint”,其被定义为允许某些有问题的代码被lint更改或跳过。因此,对于所有被lint检查的代码来说这个标志应该被认为是一个预留字。
Sparse
Sparse是一个源文件智能语法分析器:它不是编译器(虽然它可以作为一个前端编译器使用),也不是预处理器(虽然它包含部分预处理语句)。
这意味着它是一个小而简单的库。内容太少是它容易使用的部分原因。它只有一个任务,就是为任意用户创造语法分析树从而进行进一步的分析。它不是分词器,也不是那些通用的上下文无关的语法分析器。事实上,上下文(语意)就是我想说的不仅解决分组标记,而且还有type在组中的含义。
语法分析完成以下5个阶段:完整文件标记化、预处理(可以导致另一个文件进入标记阶段)、语法分析、延长性评估、内联函数扩展和简化树。
- 最新版本:0.5.0
- 发布日期:2014年1月29日
- 官网:http://git.kernel.org/cgit/devel/sparse/sparse.git/
- Git:https://git-scm.com/
- GitHub:https://github.com/sparsecli/sparse
Splint
Splint是一个辅助注释轻量级静态检查工具,检查C程序的安全漏洞和代码错误。作为一个更好的lint,使用Splint毫不费力。如果投入额外的工作添加注释到程序中,Splint可以执行比任何标准lint能完成的更强的检查。
- 最新版本:3.1.2
- 发布日期:2007年7月12日
- 官网:http://www.splint.org/
- GitHub:https://github.com/ravenexp/splint
4 Java
Checkstyle
Checkstyle是一个开发工具,可以帮助程序员编写Java代码,并使其遵守编码标准。它自动执行检查Java代码的过程,使人们从这种无聊但是重要的任务中解放出来。对于那些想要执行代码标准的项目,这是非常理想的。
Checkstyle是高配置的,几乎可以支持任何代码标准。
FindBugs
FindBugs是一个使用静态分析寻找Java代码中错误的程序。
- 最新版本:3.0.1
- 发布日期:2015年3月6日
- 官网:http://findbugs.sourceforge.net/
- Sourceforge:https://sourceforge.net/projects/findbugs/
- GitHub:https://github.com/findbugsproject/findbugs
KeY
传统的说,Key过去是一个Java程序验证工具。虽然现在这仍然是它的主要应用之一,但是这些年来它已经成长为一个拥有各种领域应用的程序验证平台。当前最重要的应用是:
- 程序验证(独立的图形用户界面、Eclipse集成、KeYHoare)
- 调试(符号执行调试器)
- 信息流分析(安全)
- 测试用例产生(KeYTestGen)
我们一直致力于让Key框架更容易被其他程序访问。例如,在另一个工具的后台可以很容易的将Key当成一个符号执行引擎使用。正在进行的工作示例有Java编译器的建造,是一个基于Key创建的符号执行树。
Soot
最初,Soot开始于一个Java优化框架,到目前为止,来自世界各地的研究人员和从业人员使用Soot分析、装备、优化和可视化Java和Android应用。它提供四种中间格式分析和转化Java字节码:
- Baf:一个字节码的简化格式,操作简单。
- Jimple:一个适合优化的3-地址类型中间格式。
- Shimple:Jimple的一个SSA变化格式。
- Grimp:一个适合反编译和代码检查的Jimple合集版本。
5 JavaScript
JSHint
JSHint是一个社区驱动工具,它检测JavaScript代码中的错误和潜在问题。例如语法错误,隐性类型转换错误,变量泄漏等等。值得注意的是,静态代码分析可以定位许多不同类型的错误,但是它不能检测出你的程序是不是正确、快速或者有没有内存泄漏。应该结合像JSHint这样的工具和单元功能测试一起审查代码。
JSHint非常灵活,使用者可以轻松的在期望的代码执行环境中调整它。
- 最新版本:2.9.4
- 发布日期:20016年10月20日
- 官网:http://jshint.com/
- GitHub:https://github.com/jshint/jshint
JSLint
JSLint本身是一个JavaScript程序,它可以寻找Javascript程序中的错误,是一个代码质量工具。
JSLint扫描JavaScript源文件,寻找错误,并返回描述问题的信息和其在程序中的大概位置。这些问题不一定是语法错误,虽然经常是这样。JSLint还查看一些风格习惯和结构问题。它不能证明你的代码是正确的,只是提供另一双眼睛去帮助发现问题。
JSLint定义了一个专业的JavaScript子集,一个比ECMAScrip程序语言标准(管理JavaScript的文件)更严格的语言。它会驳回大多数合法程序,是一个更高的标准。
6 Opa
Opa是一个用于网站开发的函数程序设计语言,编译为JavaScript。Opa包括两部分:第一,是一个来自Opa语言的编译器,功能类似JavaScript的语法但是有很多增强功能。第二,是一个JavaScript库,在运行时使用。
Opa包括它自己的静态分析器。作为一种以网站应用开发为目的的语言,强大的静态类型编译器检查高级网站数据类型的有效性,默认阻止许多漏洞,比如XSS攻击和数据库代码注入。
7 Packaging
Lintian
Lintian是一个静态分析工具,用于寻找Debian基础包中的错误、违反规则和其他的问题。它可以处理二进制Debian包(.deb)、微型/安装程序包(.udeb)、Debian源程序包(.dsc)和(有限程度的)变更文件。
- 最新版本:2.5.50
- 发布日期:2017年2月4日
- 官网:https://lintian.debian.org/
- GitHub:https://github.com/Debian/lintian
Rpmlint
Rpmlint是一个检查Rpm包中常见错误的工具。经常被用在上传之前测试单个软件包和指定文件或者检查整个分布。默认情况下执行所有可用的检查,但是专项检查可以使用命令行参数实现。
被检查的文件可以是一个Rpm软件包文件、一个指定文件或一个目录。如果是目录,递归搜索Rpm和指定文件进行检查。特殊值是指在标准输入中被读取的结果被当作单个指定文件内容处理。
- 最新版本:1.9
- 发布日期:2016年6月29日
- 官网:https://linux.die.net/man/1/rpmlint
- RPM:http://rpm.org/index.html
- GitHub:https://github.com/rpm-software-management/rpmlint
8 Perl
Perl::Critic
Perl::Critic是一个可扩展的框架,对Perl源代码创建和应用编码标准。本质上,它是一个静态源代码分析引擎。Perl::Critic分布着大量的Perl::Critic::Policy模块,它们试图执行各种编码规则。大多数规则模块以Damian Conway的书《Perl Best Practices》为基础。然而Perl::Critic不限于PBP这本书,甚至支持与Conway相矛盾的规则。你可以通过Perl::Critic接口启用、禁用和自定义这些规则。你也可以创造适合自己的新规则模块。
PerlTidy
Perltidy是一个Perl脚本,它缩进和重新格式化Perl脚本,使它们更容易阅读。如果你编写或者花很多时间读Perl脚本,你可能觉得它是有帮助的。
格式化可以使用命令行参数控制。
Perltidy可以输出置标语言和源代码。
除了重新格式化脚本,Perltidy可以很好的帮助追踪下面这些错误,缺少或多余的括号、参数和方括号,因为它非常擅长定位错误。
- 官网:http://perltidy.sourceforge.net/
- Sourceforge:https://sourceforge.net/projects/perltidy/
- GitHub:https://github.com/vifo/SublimePerlTidy
Padre
Padre是一个Perl集成开发环境,或换句话说是一个新手Perl程序员易于使用的文本编辑器,但是同时支持大型多语言和多技术项目。
我们的主要目的是创造一个无语伦比的环境来学习Perl,创建Perl脚本、模块和分布,提供一个可扩展的插件系统以支持添加相关功能和语言,同时支持高级开发者在任何地方使用这个编辑器。
它也提供静态代码分析来检查常见的初级错误。
- 官网:http://padre.perlide.org/
- GitHub:https://github.com/PadreIDE/Padre
- Perl教程:https://perlmaven.com/perl-tutorial
9 Python
Pylint
Pylint是一个Python源代码分析器,它可以查找编程错误,帮助推行编码标准并嗅探代码异味(在Martin Fowler的重构书中定义)。
Pylint有许多默认启用的规则,因为方法太多所以不能把它们全部压制在一个最小程序中。它是高度可配置的,处理程序可以在代码中控制它。另外,还可以写一些插件添加自己的检查。