Java代码静态检查技术探究(一)概述及安装

举报
Jet Ding 发表于 2021/07/22 17:37:23 2021/07/22
【摘要】 目录 【引言】【状况概述】工具检查的优势和劣势优势弱点【Infer】【SonarQube】【PMD】【最新版本】【安装和使用】安装通过命令行运行PMD注意事项使用案例-PMD运行全部规则运行指定规则XML格式输出快速启动(rulesets /java/quickstart.xml)。规则列表自定义规则创建一个规则集引入单一规则批量添加规则过滤文件处理通过命令行运行CPD使用案例-CPD【Ch...

目录

 

【引言】

【状况概述】

工具检查的优势和劣势

优势

弱点

Infer

SonarQube

PMD

【最新版本】

【安装和使用】

安装

通过命令行运行PMD

注意事项

使用案例-PMD

运行全部规则

运行指定规则

XML格式输出

快速启动(rulesets /java/quickstart.xml)。

规则列表

自定义规则

创建一个规则集

引入单一规则

批量添加规则

过滤文件处理

通过命令行运行CPD

使用案例-CPD

Checkstyle

【最新版本】

【安装和使用】

安装

运行

小结

【参考资源】

 

 

 

【引言】

前段时间写过一篇文章《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

30.png


 

Infer,有时被称为 "Facebook Infer",是由Facebook的工程团队与开源贡献者共同开发的静态代码分析工具。它提供了对JavaCCC++Objective-C的支持,并被部署在FacebookAndroidiOS应用(包括WhatsAppInstagramMessengerFacebook的主应用)的分析中。

 

下面是一个简单的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提供了全自动的分析,并能够与MavenAntGradleMSBuild和持续集成工具(Atlassian BambooJenkinsHudson等)集成。

 SonarQube安装体验截图:

31.jpg

33.jpg

34.jpg

36.jpg

37.png


PMD作为一个静态源码分析工具,它可以发现常见的编程缺陷,如未使用的变量,空的catch块,不必要的对象创建等等。它主要关注的编程语言是JavaApex,但也支持其他六种语言。

 

PMD有许多内置的检查规则, 它还支持通过API来编写自己的规则。

 

PMD可以集成到你的构建过程中。它可以作为一个质量门禁,为你的代码库提供一个编码标准。

 

此外,PMD还可以通过以下方式运行:

 

l  作为Maven任务

l  作为Ant的任务

l  作为Gradle任务

l  命令行

CPD,即复制粘贴检测器,与PMD一起发布。

 

【最新版本】

6.23.0  2020424

 

【安装和使用】

安装

PMD以压缩包的形式发布,其中包括PMDCPD。你可以从github发布的页面上下载最新的二进制版本:

https://github.com/pmd/pmd/releases

 

将其解压到任何目录中,并在你的PATH中添加bin子目录,就可以使用了。

 

通过命令行运行PMD

PMD自带几个命令行工具,如CPD、规则设计工具或PMD自身。在Unix系统中,你可以使用脚本run.sh运行其中任何一个工具,第一个参数是你要执行的工具名称('pmd''designer'...........)。

比如,PMD是通过run.sh pmd启动的。其余的参数都是特定于所使用的工具对应的参数。

  Windows 中,每个工具都有自己的启动脚本,例如 pmd.batcpd.bat

 PMD命令(pmd.batrun.sh pmd)需要两个参数:

 l  -d <path>:要分析的源代码的路径。可以是一个文件名路径,一个目录路径,或者是包含源文件的jarzip文件。

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,需要设置这个选项才能正常运行。

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。