本文是一个静态代码分析工具的清单,共有30个工具。包括4个.NET工具、2个Ada工具、7个C++工具、4个Java工具、2个JavaScript工具、1个Opa工具、2个Packaging工具、3个Perl工具、1个Python工具、1个嵌入式工具、2个二进制工具、1个静态分析工具
Fortify SCA
Fortify SCA 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果中不但包括详细的安全漏洞的信息,还会有相关的安全知识的说明,以及修复意见的提供
官网:https://fortify.com/
Coverity能够准确识别出研发工作流中的严重质量缺陷,并且提供可行的修正建议来降低软件错误和安全漏洞的修复成本、时间和风险。Coverity可使用高级源码分析技术在非常复杂的C、C++、Java、Objective-C、Javascript及C#码库中发现最严重的质量缺陷和安全漏洞, Coverity是第一个能够快速、准确分析当今的大规模(几百万、甚至几千万行的代码)、高复杂度代码的工具,Coverity解决了影响源代码分析有效性的很多关键问题:构建集成、编译兼容性、高误报率、有效的错误根源分析等。
官网:https://coverity.com
ProteCode二级制代码扫描工具
ProteCode可对应用程序和固件进行扫描,并列出所含代码和库文件相关的软件许可及对应的已知漏洞。ProteCode不仅能揭示开源的和私有的第三方代码和库文件,还能够枚举出对应的CVE(Common Vulnerabilities and Exposures)标识符以及相关的软件许可证。将编译好的二进制文件上传(不需要源代码),仅需花费几分钟时间就可以揭示出你所需要的软件内部运行的信息。解决方案有助于研发团队安全无误地使用和管控第三方代码。在开发和测试流程或法律合规部门管理由于使用第三方代码所产生的风险,其中包括开源、内部开发、外包和商业代码。
荷兰Hex-Rays公司的二进制分析工具能够将二进制代码转换成分析员们容易可以读取和修改的文本,帮助分析员分析和验证的程序,更快捷的判断软件的有用性和可用性,定位安全问题。
.NET
.NET Compiler Platform(代号 Roslyn)
Roslyn提供有着丰富的代码分析API的开源C#和Visual Basic编译器。它可以使用这些Visual Studio里的API生成代码分析工具。
官网:https://roslyn.codeplex.com/
CodeIt.Right提供一个快速的自动的方法确保你的源代码遵循预先定义的设计和风格准则。它通过以下方式使静态代码分析进入更高水平:即时代码审查、及早发现问题、编码原则、自动代码审查、集成StyleCop检查、报告。
一个实现.NET静态代码分析的图形用户接口和命令行工具。
FxCop提供几百种规则实现各种类型的分析。包括:设计、全球化、互操作性、可维护性、灵活性、命名、性能、可移植性、可靠性、安全性,利用率。FxCop的功能完全集成到Visual Studio2010的高级版和最终版中。
StyleCop分析C#源代码,强制执行一系列风格和一致性规则。可以在Visual Studio内部运行,也可以集成到MSBuild项目中。StyleCop还可以被集成到很多第三方开发工具中。
核心原则:
StyleCop通过为C#代码强制执行一组通用风格规则来体现价值。StyleCop将继续利用一个连续的带有允许的最小规则配置的规则集。开发者可以实现他们自己的规则,只要他们愿意。
StyleCop拥有和Visual Studio、MSBuild,TFS等无缝集成的能力。开发者可以自由执行自定义代码,将StyleCop集成到其他开发和工具环境,如SDK文档中所述。
AdaControl是一个免费的(授权)工具,可以检测Ada程序中使用的各种结构。它的首要目标是控制风格和程序规则的正确使用,但是它也可以作为一个强大的工具搜索编程风格或设计模式的各种形式。搜索的元素范围有非常简单的,比如某种实体、声明或语句的出现,也有非常复杂的,比如验证遵守了某种编程模式。
Fluctuat是一抽象解释器,以数字编程(C或Ada)静态分析器为基础,由CEA-LIST的ME ASI(ModElling and Analysis of Systems in Interaction)实验室在2001年开发。给出一组输入和参数,可能带有不确定因素,它会考虑这个程序所有可能的行为,无论是真实的还是有限精度下,并描述这些不同的特性。
BLAST(Berkeley Lazy Abstraction Software verification Tool伯克利惰性抽象软件验证工具)是一个C语言静态软件验证工具,它可以解决可达性问题,例如是否可以通过一个有效的执行命令从入口点(主程序)到达给定的程序位置。
安全属性的验证可能降低到可达性,BLAST常常用于核查Linux驱动程序验证项目。
可以在以下网站下载Linux系统的BLAST源代码或二进制版本。
这个项目继续开发cpplint,它是一个C++风格检查器,遵循Google的C++风格指南。提供的cpplint 为PYPI(Python Package Index)包,并添加了几个功能和修复程序。它是google/styleguide的一个分支,希望未来可以合并在一起。
Coccinelle是一个程序匹配和转换引擎。它提供语意修补程序以便在C代码中指定期望的匹配和转换。Coccinelle初始的目的是完成Linux的间接开发。这种开发包括客户端代码中所需要的改变,目的是响应库应用程序接口变化。还可能包括一些修改,例如重命名一个函数、添加一个函数参数,它的值以某种方式被上下文决定、重组数据结构。除了间接开发,Coccinelle还可以成功的寻找和修复系统代码中的错误。
Frama-C是一个平台,致力于分析用C语言写的源代码。
Frama-C集成几个分析技术到一个协作平台中。其包含一组提供核心功能的内核(例如一个C程序的抽象化语法树)和一组被称为插件的分析器。这些插件可以建立在平台中其他插件的计算结果之上。
归功于这个方法,Frama-C能提供一些复杂的工具,包括:
这些插件共享常见的语言,可以通过ASCL(ANSI/ISO C Specification Language)特性交换信息,还可以通过它们的APIs集合信息。
Lint实用程序尝试检测命名为C程序文件的功能,可能是错误,也可能是不可移植,或者是浪费。同时它也执行比C编译器更严格的类型检查。Lint实用程序运行C预处理器作为它的第一阶段,带有这个预处理器的标志“lint”,其被定义为允许某些有问题的代码被lint更改或跳过。因此,对于所有被lint检查的代码来说这个标志应该被认为是一个预留字。
Sparse是一个源文件智能语法分析器:它不是编译器(虽然它可以作为一个前端编译器使用),也不是预处理器(虽然它包含部分预处理语句)。
这意味着它是一个小而简单的库。内容太少是它容易使用的部分原因。它只有一个任务,就是为任意用户创造语法分析树从而进行进一步的分析。它不是分词器,也不是那些通用的上下文无关的语法分析器。事实上,上下文(语意)就是我想说的不仅解决分组标记,而且还有_type_在组中的含义。
语法分析完成以下5个阶段:完整文件标记化、预处理(可以导致另一个文件进入标记阶段)、语法分析、延长性评估、内联函数扩展和简化树。
Splint是一个辅助注释轻量级静态检查工具,检查C程序的安全漏洞和代码错误。作为一个更好的lint,使用Splint毫不费力。如果投入额外的工作添加注释到程序中,Splint可以执行比任何标准lint能完成的更强的检查。
Checkstyle是一个开发工具,可以帮助程序员编写Java代码,并使其遵守编码标准。它自动执行检查Java代码的过程,使人们从这种无聊但是重要的任务中解放出来。对于那些想要执行代码标准的项目,这是非常理想的。
Checkstyle是高配置的,几乎可以支持任何代码标准。
FindBugs是一个使用静态分析寻找Java代码中错误的程序。
传统的说,Key过去是一个Java程序验证工具。虽然现在这仍然是它的主要应用之一,但是这些年来它已经成长为一个拥有各种领域应用的程序验证平台。当前最重要的应用是:
我们一直致力于让Key框架更容易被其他程序访问。例如,在另一个工具的后台可以很容易的将Key当成一个符号执行引擎使用。正在进行的工作示例有Java编译器的建造,是一个基于Key创建的符号执行树。
最初,Soot开始于一个Java优化框架,到目前为止,来自世界各地的研究人员和从业人员使用Soot分析、装备、优化和可视化Java和Android应用。它提供四种中间格式分析和转化Java字节码:
JSHint是一个社区驱动工具,它检测JavaScript代码中的错误和潜在问题。例如语法错误,隐性类型转换错误,变量泄漏等等。值得注意的是,静态代码分析可以定位许多不同类型的错误,但是它不能检测出你的程序是不是正确、快速或者有没有内存泄漏。应该结合像JSHint这样的工具和单元功能测试一起审查代码。
JSHint非常灵活,使用者可以轻松的在期望的代码执行环境中调整它。
JSLint本身是一个JavaScript程序,它可以寻找Javascript程序中的错误,是一个代码质量工具。
JSLint扫描JavaScript源文件,寻找错误,并返回描述问题的信息和其在程序中的大概位置。这些问题不一定是语法错误,虽然经常是这样。JSLint还查看一些风格习惯和结构问题。它不能证明你的代码是正确的,只是提供另一双眼睛去帮助发现问题。
JSLint定义了一个专业的JavaScript子集,一个比ECMAScrip程序语言标准(管理JavaScript的文件)更严格的语言。它会驳回大多数合法程序,是一个更高的标准。
Opa是一个用于网站开发的函数程序设计语言,编译为JavaScript。Opa包括两部分:第一,是一个来自Opa语言的编译器,功能类似JavaScript的语法但是有很多增强功能。第二,是一个JavaScript库,在运行时使用。
Opa包括它自己的静态分析器。作为一种以网站应用开发为目的的语言,强大的静态类型编译器检查高级网站数据类型的有效性,默认阻止许多漏洞,比如XSS攻击和数据库代码注入。
Lintian是一个静态分析工具,用于寻找Debian基础包中的错误、违反规则和其他的问题。它可以处理二进制Debian包(.deb)、微型/安装程序包(.udeb)、Debian源程序包(.dsc)和(有限程度的)变更文件。
Rpmlint是一个检查Rpm包中常见错误的工具。经常被用在上传之前测试单个软件包和指定文件或者检查整个分布。默认情况下执行所有可用的检查,但是专项检查可以使用命令行参数实现。
被检查的文件可以是一个Rpm软件包文件、一个指定文件或一个目录。如果是目录,递归搜索Rpm和指定文件进行检查。特殊值是指在标准输入中被读取的结果被当作单个指定文件内容处理。
Perl::Critic是一个可扩展的框架,对Perl源代码创建和应用编码标准。本质上,它是一个静态源代码分析引擎。Perl::Critic分布着大量的Perl::Critic::Policy模块,它们试图执行各种编码规则。大多数规则模块以Damian Conway的书《Perl Best Practices》为基础。然而Perl::Critic不限于PBP这本书,甚至支持与Conway相矛盾的规则。你可以通过Perl::Critic接口启用、禁用和自定义这些规则。你也可以创造适合自己的新规则模块。
Perltidy是一个Perl脚本,它缩进和重新格式化Perl脚本,使它们更容易阅读。如果你编写或者花很多时间读Perl脚本,你可能觉得它是有帮助的。
格式化可以使用命令行参数控制。
Perltidy可以输出置标语言和源代码。
除了重新格式化脚本,Perltidy可以很好的帮助追踪下面这些错误,缺少或多余的括号、参数和方括号,因为它非常擅长定位错误。
Padre是一个Perl集成开发环境,或换句话说是一个新手Perl程序员易于使用的文本编辑器,但是同时支持大型多语言和多技术项目。
我们的主要目的是创造一个无语伦比的环境来学习Perl,创建Perl脚本、模块和分布,提供一个可扩展的插件系统以支持添加相关功能和语言,同时支持高级开发者在任何地方使用这个编辑器。
它也提供静态代码分析来检查常见的初级错误。
Pylint是一个Python源代码分析器,它可以查找编程错误,帮助推行编码标准并嗅探代码异味(在Martin Fowler的重构书中定义)。
Pylint有许多默认启用的规则,因为方法太多所以不能把它们全部压制在一个最小程序中。它是高度可配置的,处理程序可以在代码中控制它。另外,还可以写一些插件添加自己的检查。