Java代码静态检查技术探究(一)概述及安装
目录
快速启动(rulesets /java/quickstart.xml)。
【引言】
前段时间写过一篇文章《C&C++代码编译和分析工具探究》(http://3ms.huawei.com/km/blogs/details/8137069), 现在我们来看看Java代码静态分析工具。本文选取工具的筛选原则如下:
1. 开源工具或者免费工具;
2. 社区支持活跃的工具;
【状况概述】
源代码分析工具,也称为静态应用安全测试(SAST)工具,是用来分析源代码和/或编译版本的代码,以帮助发现安全漏洞。
有些工具已经在代码编辑工具IDE中使用了。对于那些在软件开发阶段本身就能检测到的问题,作为开发人员我们当然应该快速讨论并修复这些问题。
如果更多的问题在早期阶段能够尽可能的被发现并解决,那么在开发周期的后期,问题的发现和修复难度就会小一些。
在开发周期后期阶段,代码质量的评估和问题的发现需要借助代码静态分析工具。
工具检查的优势和劣势
优势
l 良好的扩展性:可以与很多软件工具集成运行,并且可以重复运行(如例行构建或持续集成)。
l 能够自动发现有用的问题,比如缓冲区溢出、SQL注入缺陷等。
l 分析结果输出比较清晰易懂:能够显示精确的源文件名、行号,甚至是受影响的那一行的某部分。
弱点
l 很多类型的安全漏洞很难被自动发现,如身份验证问题、访问控制问题、密码技术的不安全使用等。就目前的技术水平而言,这类工具只能自动找到相对较小比例的应用安全漏洞。不过,这类工具的功能会越来越完善。
l 误报率较高。
l 配置问题导致无法发现代码中的问题,而这些配置问题不容易纠错。
l 有时候难以确定已发现的安全问题是一个实际的问题。
l 许多此类工具难以分析无法编译的代码。
【Infer】
Infer,有时被称为 "Facebook Infer",是由Facebook的工程团队与开源贡献者共同开发的静态代码分析工具。它提供了对Java、C、C、C++和Objective-C的支持,并被部署在Facebook的Android和iOS应用(包括WhatsApp、Instagram、Messenger和Facebook的主应用)的分析中。
下面是一个简单的Java例子来说明Infer的工作原理
// Hello.java
class Hello {
int test() {
String s = null;
return s.length();
}
}
:要运行Infer,请在终端中从与Hello.java相同的目录下键入:
nfer run -- javac Hello.java
你应该看到Infer报告的以下错误:
Hello.java:5: error: NULL_DEREFERENCE
object s last assigned on line 4 could be null and is dereferenced at line 5
现在编辑文件,增加无效检查:
class Hello {
int test() {
String s = null;
return s == null ? 0 : s.length();
}
}
再次运行 Infer。这一次,Infer报告没有发现问题。
【SonarQube】
SonarQube(原名Sonar)是SonarSource开发的一个开源平台,用于检查代码质量,通过对代码进行静态分析进行自动审查,可对20多种编程语言的bug、代码风格和安全漏洞进行检测。
SonarQube提供代码重复、编码标准、单元测试、代码覆盖率、代码复杂度、注释、bug和安全漏洞等报告。
SonarQube可以记录度量历史,并提供进化图。
SonarQube提供了全自动的分析,并能够与Maven、Ant、Gradle、MSBuild和持续集成工具(Atlassian Bamboo、Jenkins、Hudson等)集成。
SonarQube安装体验截图:
PMD作为一个静态源码分析工具,它可以发现常见的编程缺陷,如未使用的变量,空的catch块,不必要的对象创建等等。它主要关注的编程语言是Java和Apex,但也支持其他六种语言。
PMD有许多内置的检查规则, 它还支持通过API来编写自己的规则。
PMD可以集成到你的构建过程中。它可以作为一个质量门禁,为你的代码库提供一个编码标准。
此外,PMD还可以通过以下方式运行:
l 作为Maven任务
l 作为Ant的任务
l 作为Gradle任务
l 命令行
CPD,即复制粘贴检测器,与PMD一起发布。
【最新版本】
6.23.0 于 2020年4月24日
【安装和使用】
安装
PMD以压缩包的形式发布,其中包括PMD和CPD。你可以从github发布的页面上下载最新的二进制版本:
https://github.com/pmd/pmd/releases
将其解压到任何目录中,并在你的PATH中添加bin子目录,就可以使用了。
通过命令行运行PMD
PMD自带几个命令行工具,如CPD、规则设计工具或PMD自身。在Unix系统中,你可以使用脚本run.sh运行其中任何一个工具,第一个参数是你要执行的工具名称('pmd'、'designer'、...........)。
比如,PMD是通过run.sh pmd启动的。其余的参数都是特定于所使用的工具对应的参数。
在 Windows 中,每个工具都有自己的启动脚本,例如 pmd.bat、cpd.bat。
PMD命令(pmd.bat或run.sh pmd)需要两个参数:
l -d <path>:要分析的源代码的路径。可以是一个文件名路径,一个目录路径,或者是包含源文件的jar或zip文件。
l -R <path>:你要使用的规则集文件。PMD 使用 xml 配置文件,称为规则集,指定在源代码上执行哪些规则。你也可以通过引用规则集的类别和名称来运行单个规则。例如,你可以用
-R category/java/codestyle.xml/UnnecessaryModifier检查Java源上是否有不必要的修改器。
注意事项
以前提供的规则集 (例如 rulesets/java/basic.xml) 已经过时了,如果你想继续使用也是可以的。PMD目前包含了Java的快速入门规则集作为基础配置供您参考: rulesets/java/quickstart.xml。强烈建议从一开始您就创建自己的规则集。
此外,下面的可选选项在大多数情况下会被指定:
l -f <format>:报告格式。PMD支持文本或xml格式,缺省是文本。
l -auxclasspath <classpath>:指定被分析的Java源码的编译后的类路径。这个设置可以让PMD使用反射进行更深入的分析, 有些规则比如MissingOverride,需要设置这个选项才能正常运行。
- 点赞
- 收藏
- 关注作者
评论(0)