《java代码静态检查工具介绍》由会员分享,可在线阅读,更多相关《java代码静态检查工具介绍(6页珍藏版)》请在金锄头文库上搜索。
1、静态检查:静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。代码检查代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性, 代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。 ”。看了一系列的静态代码扫描或者叫静态代码分析工具后,总结对工具的看法:静态代码扫描工具,和编译器的某些功能其实是很
2、相似的,他们也需要词法分析,语法分析,语意分析.但和编译器不一样的是他们可以自定义各种各样的复杂的规则去对代码进行分析。静态检测工具:1. PMD1)PMD 是一个代码检查工具,它用于分析 Java 源代码,找出潜在的 问题:1)潜在的 bug:空的 try/catch/finally/switch 语句2)未使用的代码:未使用的局部变量、参数、私有方法等3)可选的代码:String/StringBuffer 的滥用4)复杂的表达式:不必须的 if 语句、可以使用 while 循环完成的 for 循环5)重复的代码:拷贝/粘贴代码意味着拷贝/粘贴 bugs2)PMD 特点:1)与其他分析工具不
3、同的是,PMD 通过静态分析获知代码错误。也就是说,在不运行 Java 程序的情况下报告错误。2)PMD 附带了许多可以直接使用的规则,利用这些规则可以找出 Java 源程序的许多问题3)用户还可以自己定义规则,检查 Java 代码是否符合某些特定的编码规范。3)同时,PMD 已经与 JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator 以及 Emacs集成在一起。4)PMD
4、 规则是可以定制的: 可用的规则并不仅限于内置规则。您可以添加新规则:可以通过编写 Java 代码并重新编译 PDM,或者更简单些,编写 XPath 表达式,它会针对每个 Java 类的抽象语法树进行处理。5)只使用 PDM 内置规则,PMD 也可以找到你代码中的一些真正问题。某些问题可能很小,但有些问题则可能很大。PMD 不可能找到每个 bug,你仍然需要做单元测试和接受测试,在查找已知 bug 时,即使是 PMD 也无法替代一个好的调试器。但是,PMD 确实可以帮助你发现未知的问题。1. FindBugs1)FindBugs 是一个开源的静态代码分析工具,基于 LGPL 开源协议,无需运行
5、就能对代码进行分析的工具。不注重 style 及 format,注重检测真正的 bug 及潜在的性能问题 ,尤其注意了尽可能抑制误检测(false positives)的发生。以 bytecode(*.class、*.jar)为对象进行检查。除了单独动作,还可以用作 Eclipse 的 plug-in,以及嵌入 Ant 作为 task 之一 进行利用。2)findbugs 自带检测器的介绍: findbugs 自带 60 余种 Bad practice,80 余种Correntness,1 种 Internationalization,12 种 Malicious codevulnerabil
6、ity,27 种 Multithreaded correntness,23 种 Performance,43 种 Dodgy。3)Findbugs 的一些特点:1)FindBugs 主要着眼于寻找代码中的缺陷,这就与其他类似工具有些区别了,直接操作类文件(class 文件)而不是源代码。2)FindBugs 可以通过命令行、各种构建工具(如 Ant、Maven 等)、独立的Swing GUI 或是以 Eclipse 和 NetBeans IDE 插件的方式来运行。 3)FindBugs 输出结果既可以是 XML 的,也可以是文本形式的。4)开发者可以通过多种方式来使用 FindBugs,最常见
7、的是在新编写模块的代码分析以及对现有代码进行更大范围的分析。 5)不注重 style 及 format,注重检测真正的 bug 及潜在的性能问题,尤其注意了尽可能抑制误检测(false positives)的发生。 4)FindBugs 可检测的 bug pattern 举例:检测 java programing 中容易陷入的 bug pattern,equals() 实现时的一般规约违反Null pointer 的参照 ,Method 的返回值的 check 遗漏 ,初始化前 field 的访问,Multi-thread 的正确性, 同期化处理的矛盾, 无条件的 wait(), Code 的
8、脆弱性 ,可以变更的静态 object ,内部数列参照的 return 等1. Checkstyle1)定义: Checkstyle 是一款检查 Java 程序源代码样式的工具。2)特点:1)它可以有效的帮助我们检视代码以便更好的遵循代码编写标准,特别适用于小组开发时彼此间的样式规范和统一。2)Checkstyle 提供了高可配置性,以便适用于各种代码规范,所以除了使用它提供的几种常见标准之外,你也可以定制自己的标准。3)Checkstyle 提供了支持大多数常见 IDE 的插件,大部分插件中就含有最新的 Checkstyle,就不用费心再部署一份了。4)Checkstyle 可以检查代码的很
9、多方面,从传统观点看,它主要是用来检查代码层面的,自从第三版以后,它的内部架构作了重大改变,很多其它意图的检测加了进来,现在 Checkstyle 可以检查像类设计的问题,重复代码,如锁的双重检查的 bug 模式。3)CheckStyle 的主要流程是:1)对 Java 文件进行词法语法分析,生成语法树。2)载入配置文件(checkstyle-metadata.xml 以及自定义的配置文件)register check 事件。3)按照深度优先遍历对语法树进行解析,按照注册的事件,在到达某些节点( AST ) 时进行 style 检查(AST,A child-Sibling Tree,是语法树中
10、的某个节点,其类型在 TokenTypes 类中定义。)4)我们所说的自定义 Style 的检查,就是在第二步设定的。这里牵涉到一个叫 com.puppycrawl.tools.checkstyle.api.Check 的类,我们通常需要重载其中的两个函数: public int getDefaultTokens()和 public void visitToken(DetailAST ast). 这两个函数的含义为,在遍历语法树的过程中,每当到达 getDefaultTokens 函数所返回的 AST 类型,程序就进入 visitToken 进行具体的检查和分析,即,真正的分析检查过程是在vi
11、sitToken 中实现的。1. Hammurapi1)定义: Hammurapi 它是一个开源的代码审查/评审(review)工具。它可以帮助改进Java 代码的质量。它可以基于一套设计规范来分析代码库。当它碰到违反规范的地方,会在报告中标识。就像 Checkstyle 一样,它与 Ant 无缝集成并且由基于 XML 配置文件来驱动。2)特点:1)Hammurapi 是用来强制代码设计规范的。2)Hammurapi 是一个遵循设计的工具,提供了自动而且一致的方式来实现设计规范,因此使代码评审更加有效而轻松。3)Hammurapi 如何工作:Hammurapi 这样的代码分析工具都带有语言分析
12、器。语言分析器是一种输入语言代码并输出抽象语法树的工具。这个树上的节点代表语言标识。例如,考虑一下简单的算术表达式:3+4. 语言分析器会解析他成为一个如图 5 所示的语法树。在这个树中,节点+代表操作符标识。节点 3 和 4 是操作数标识 Hammurapi使用 ANTLR(另一个语言识别工具)作为语言分析器。然而 ANTLR API 是相当底层的。为改善可用性,Hammurapi 使用另一个 API,基于 ANTLR 的 JSEL(Java 源程序工程类库),来访问抽象语法树。 一旦树构建完成,一种树遍历算法就被用来访问树中每一个节点。每次访问到一个节点,一种回调机制(Visitor 模式
13、)被用来提示相应的检查器。在这些回调方法中,检查器收集相关的信息来确定是否有违反规范的地方存在。1. Lint4j1)定义:Lint4J 是一个针对 Java 的源代码分析工具,它可以对 Java 源码和字节码进行静态分析,判断其中是否存在死锁、性能问题或者伸缩性问题。它可以集成到任何 IDE 种或构建系统2)特点:1)检测代码语法规则2)潜在的 bug3)检测编码模式对代码可读性及大小的影响4)检测是否违反 EJB 规范1. Sonar1)定义:代码质量管理工具 Sonar 提供了设计与架构度量。Sonar 2.0 引入了针对 Java 应用的设计分析、架构与面向对象的度量,Sonar 2.
14、1 可以检测到未使用的方法以及对不建议使用方法的调用。是一个集成了CheckStyle,PMD,Findbugs 的代码校验规则 ,重复代码发现,代码测试覆盖率, 代码注释率,及所有的检测率变化追踪的完美代码质量检查工具。它包含了代码质量检测的七个方面,如下图2)特点:1)代码覆盖:通过单元测试,将会显示哪行代码被选中。2)改善编码规则。3)搜寻编码规则:按照名字,插件,激活级别和类别进行查询。4)项目搜寻:按照项目的名字进行查询。5)对比数据:比较同一张表中的任何测量的趋势。6)单元测试3)Sonar2.1:Sonar 还基于 Squid 引入了一个全新的规则引擎、Sonar 解析器既可以处
15、理源代码,也可以处理字节码,解析器带有内建的规则,可以检测未使用的私有与保护方法以及客户端对不建议使用的方法的调用。Squid 通过分析应用源代码、Java API 和外部程序库的字节码来决定哪些方法、类和属性是不建议使用的。Sonar 2.1 的新特性:1)一个全新的“Libraries”页面,显示了项目中所有的程序库和依赖,该特性要求使用Maven 来构建项目。一旦在 Sonar 站点的主页上选择了一个项目,该服务就会以可视化的树形结构展示出项目依赖。此外,还有一个可选的动态过滤器,可以根据名称过滤程序库以便在应用的依赖间导航。2)用于搜索程序库使用情况的“Dependencies”页面。
16、比如说,可以搜索到使用了第三方框架如 Commons Logging 1.1 的所有项目。3)可以使用各种插件扩展 Sonar 的功能。现在有一个全新的“System Info”页面显示了系统属性、已装插件和 Java 虚拟机内存统计信息。该页面还给出了关于 Sonar 配置和数据库统计的详细信息。4)一个用于管理已装插件和系统信息的管理控制台。最新版的 Sonar 为这些插件引入了一个测试框架和一个客户化的 Maven生命周期管理工具。它还带有一个用于集成项目事件的Web Service 并在项目的 size widget 中增加了一个新的度量模块。1. JDepend1)JDepend 一个开放源代码的可以用来评价 Java 程序质量的优秀工具,它遍历 Java class 的文件目录,以 Java 包(package)为单位,为每一个包/类自动生成 包的依赖程度,稳定性,可靠度等的评价报告,根据这些报告,我们可以得到包或类之间的依赖关系,并分析出包的稳定程度,抽象程度,是否存在循环依耐关系等