如何更好地利用Pmd、Findbugs和CheckStyle分析结果

标签: 利用 pmd findbugs | 发表时间:2014-10-30 22:25 | 作者:jacking124
出处:http://www.iteye.com

这里列出了很多Java静态分析工具,每一种工具关注一个特定的能发挥自己特长的领域,我们可以列举一下:

  • Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:
    – 可能的bug——空的try/catch/finally/switch块。
    – 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
    – 空的if/while语句。
    – 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
    – 可优化的代码:浪费性能的String/StringBuffer的使用。

  • FindBugs 它用来查找Java代码中存在的bug。它使用静态分析方法标识出Java程序中上百种潜在的不同类型的错误。

  • Checkstyle 它定义了一系列可用的模块,每一个模块提供了严格程度(强制的,可选的…)可配置的检查规则。规则可以触发通知(notification),警告(warning)和错误(error)。

现在有很多查看这些工具的处理结果的方式:

  • XML格式:这些工具都可以产生XML文件,这些XML文件能用来产生HTML报表或者是被别的工具用来浏览分析的结果。
  • HTML格式:HTML格式是最受欢迎的产生报表和团队间分享的的方式,你也可以用xsl表格创建你自己的报表。
  • IDE插件:几乎所有叫得上名字的IDE都给这些工具提供了插件,这使得发现源码中存在的所有问题几乎变成可能。

代码质量工具的一个问题是,它们有时候会给开发者提示很多不是错误的错误-也叫做假阳性(false positives)。当这种情况发生的时候,开发者可以学着忽略工具的输出信息,或者是把这些输出全部抛弃掉。

为了更好的利用这些工具的输出结果,给开发者一个更有用的视图,最好是有一种只关注我们想要的东西的方式。本文中,我们将找出其他有趣的方式来更好的利用所有这些有名的Java静态分析工具的输出结果,然后可以像查询数据库那样查询这些结果。

JArchitect和CQLinq

JArchitect是另一个静态分析工具,它弥补了其他工具(的不足),它是使用一种基于Linq(CQLinq)的代码查询语言像查询数据库那样来查询代码。

JArchitect3的以前版本,只能查询从JArchitect提取出来的分析数据,但是从JArchitect4开始,可以把许多其他静态分析工具的输出结果包含进来,然后使用CQLinq做查询。

让我们以PDT核心( Eclipse的Php插件)的源码为例来说明如何在JArchitect中利用好这些静态工具的分析结果。

在查询分析结果以前,要遵守以下几个步骤:

  • 第一步:

用PMD,CPD,FindBugs和CheckStyle分析项目工程,生成包含分析结果的XML文件。

  • 第二步:

用JArchitect分析项目工程。

  • 第三步:

在JArchitect点击菜单“插件(Plugins)”->“导入插件结果文件(Import Plugins Result Files)”把所有的XML文件导入到JArchitect中。

JArchitect默认给这些工具提供了许多有用的查询,并且这些查询都是可以很简单的进行定制的。

让我们来看一些CQLinq的查询:

获取的所有的问题(issue):

获取所有问题的请求很简单,但是没什么用处,因为如何利用23272个问题的分析结果确实是一个很大的挑战。

为了更好的利用这些工具的分析结果,我们可以用CQLinq来做过滤,然后只关注那些我们想要关注的东西。

根据所使用的检查工具发请求

我们可以修改第一个请求,然后添加一个查询工具的criteria。

据规则集发请求

我们也可以根据问题的规则集做过滤:

根据优先级发请求

也可以根据优先级做过滤:

出现次数最多的问题

知道哪些问题是被这些工具报告次数最多的是很有用的。

出现问题最多的类

知道哪些类包含了最多的问题是很有用的。

上图可以看出来,CheckStyle报告的上千个问题中有很多是可以忽略的。

前面的查询很有用,但是,它并没有给我们一个精确的类质量的信息,因为要考虑的另一个有用的维度就是代码行数(NBLinesOfCode)。一般 来说代码行数多的类会包含更多的问题,基于这个考虑,我们可以修改之前的请求来计算出问题数目和代码行数(NBLinesOfCode)的比率。

上面的查询结果看上去很奇怪,前8个类的问题数和代码行数比率超过了200,也就是说一行代码有超过200个问题。

为了解释这种行为,我们看下CompilerAstParser的一些代码:

代码行数(NBLinesOfCode)指的是语句的数目而不是代码的物理行数,CompilerAstParser这个类声明了很多数组,每一个都包含了几千个物理行,但是,每一个数组都被认为是一个语句。

就像前面展示的出现次数最多的问题那样,每一个数组都把”+应该在一个新行上”这个规则违反了上千次。或许最好是应该把这样的规则从CheckStyle的配置文件中删掉。

出问题最多的方法

当静态警察工具报告了问题以后,定位解决问题的优先级是很有用的,尤其是当包含bug的时候。

bug可能存在于某一个特定的方法中,但是,知道还有多少方法也受这个bug的影响是非常有用的。知道了出问题最多的这个方法做好事尽快把它解决掉。

使用CQLinq,我们可以把这些工具的结果和JArchitect的结果结合起来创建出更复杂的查询,然后把这些检查规则添加到构建过程中去。

问题的趋势

工程中有问题并不是异常情况,我们甚至可以说是正常的,但是,我们要检查工程的质量趋势。如果随着工程的更新和演化问题数目增加了,将会是一个很坏的指标。

JArchitect提供了趋势监控特性来创建趋势图。趋势图是根据分析时间记录的特定维度上的值创建出来的。默认有50多个趋势维度,也可以很简单定制趋势维度。

下面给Pmd问题创建一个趋势维度:

然后,你就可以很简单的创建趋势图在趋势维度上做监控,然后把它添加到JArchitect的操作面板中。

有了这个趋势图,我们就可以监视Pmd问题的进化,然后发现这个维度的问题随版本进化的原因。

定制JArchitect报表

JArchitect可以在列出了CQLinq查询的HTML报表中追加额外的报表区。

在CQLinq查询浏览面板中,一个特定的CQLinq组是用橙色的的边框包围的。

也可以把Pmd趋势图添加到报表中:

在HTML报表中,这些被添加进来的区域可以通过菜单访问:

这是被添加进Pmd查询报表中的页面:

结论

JArchitect 4 对其他的静态分析工具是开放的,你也可以很简单的像本文说的那样把你自己的工具做成它的插件。这样你就可以使用JArchitect的所有的功能来更好的利用那些有名的java静态分析工具的分析结果。

原文链接: javadepend 翻译: ImportNew.com - miracle1919
译文链接: http://www.importnew.com/11119.html
[ 转载请保留原文出处、译者和译文链接。]



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [利用 pmd findbugs] 推荐:

如何更好地利用Pmd、Findbugs和CheckStyle分析结果

- - Java - 编程语言 - ITeye博客
这里列出了很多Java静态分析工具,每一种工具关注一个特定的能发挥自己特长的领域,我们可以列举一下:. Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:. – 可能的bug——空的try/catch/finally/switch块. – 无用代码(Dead code):无用的本地变量,方法参数和私有方法.

Eclipse:使用PMD预先检测错误

- - CSDN博客研发管理推荐文章
PMD是一款静态代码分析工具,它能够自动检测各种潜在缺陷以及不安全或未优化的代码. Checkstyle之类的其它工具可以检查代码是否遵循了约定和标准. 而PMD功能则更多地是集中在预先检测缺陷上,它提供了高度可配置的丰富规则集,用户可以方便配置对待特定项目使用那些规则. 在Eclipse中安装和使用PMD步骤 .

[转]Findbugs安装使用文档

- - 小鸥的博客
       Findbugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题. 利用这个工具,就可以在不实际运行程序的情况对软件进行分析.        Findbugs提供了方便操作的可视化界面,同时也可以作为Eclipse的一个插件来使用,而我们使用得最多的还是作为Eclipse的插件来使用.

findbugs 常见问题 及解决方案

- - ITeye博客
1 Bad practice 坏的实践. 一些不好的实践,下面列举几个: HE:类定义了equals(),却没有hashCode();或类定义了equals(),却使用Object.hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode().

一些你不知道的事,findbugs的配置和使用

- - CSDN博客推荐文章
作为一个程序员,你不得不知道一些提高代码开发性能和开发效率的工具或者插件的使用,再说现在好多的公司都讲究快速开发,如果周期时间短那么你的程序的bug通过一些工具来搞,岂不是方便很多吗,但是插件毕竟还是有很大的局限性,比如findbugs就只能找出java文件里面的bug,下一篇我们来学习pmd的代码优化.

利用sockstunnel翻越

- - 0.618網絡空間
首先在你的linux vps上搭建python環境(一般來說,linux vps都已搭好了python 環境). 然後運行如下命令(假設你在/root下):. 這樣在/root/下,就生成了privkey.pem和cacert.pem. 修改sslserver.py裏的. keyfile="privkey.pem",為.

转角的空间利用

- Ivy - IDSOO
拐角的空间如果不充分利用似乎有一些浪费. 日本的设计工作室Torafu Architects设计的这个隔板巧妙地利用了拐角,搭建了一个可以放置物品的平台,设计实用、美观、大方.

旧灯泡的再利用

- Jimmy - 微奇生活
生活水平提高了,家家户户也用上了节能灯,那些废旧的白炽灯泡如何利用呢. 看看下面这些妙点子吧,可以种盆栽,做工艺品,还能用来养金鱼~~灯泡还会跳舞呢. 简洁的线圈灯:Coil Lamp. 微博:@新浪 | @腾讯     订阅:Google | 九点 | QQ | 鲜果 | 有道 | 邮箱.

[译]jboss漏洞利用

- - 互联网 - ITeye博客
原文地址:http://resources.infosecinstitute.com/jboss-exploitation/. JBoss Application Server是一个基于Jave EE的web应用服务器. 如果Jboss没有正确配置,它会允许攻击者进行各种恶意攻击. 由于JMX console可以通过端口8080远程访问,攻击者和恶意用户可以通过使用Jboss console中的DeploymentScanner功能部署他们自己的WAR(web archive)文件或shell脚本.

利用HTTP Cache来优化网站

- scourgen - 博客园-首页原创精华区
对于网站来说,速度是第一位的. 用户总是讨厌等待,面对加载的Video和页面,是非常糟糕的用户体验. 所以如何利用Cache来优化网站,值得深入研究. 缓存是一个到处都存在的用空间换时间的例子. 通过使用多余的空间,我们能够获取更快的速度. 用户在浏览网站的时候,浏览器能够在本地保存网站中的图片或者其他文件的副本,这样用户再次访问该网站的时候,浏览器就不用再下载全部的文件,减少了下载量意味着提高了页面加载的速度.