Java静态分析:入门

时间:2012-02-19 22:19:05

标签: java code-coverage static-analysis

您好我想开始玩java源代码的静态分析。首先,直接解析我的源代码树似乎最简单,但是假设有针对此的API。特别是拥有一个允许代码的API会很好:

for (MetaClass m : mySourcePackage.getClasses()) 
{
       System.out.println(m.getMethods().size());
       ...
}

当然,对于任何给定的类,你可以使用反射来做到这一点 - 但我更感兴趣的是从头开始静态分析整个源代码包 - 并逐个遍历类(例如,评估事物)像测试覆盖率,最大线等...)。

是否有用于进行此类元分析的高质量开源框架(或者,是否可以使用某个类路径启动JVM并在JVM内部进行此类分析)?

请记住,我并不特别担心DI和反射之类的陷阱(至少在这一点上不是这样)。

4 个答案:

答案 0 :(得分:3)

Findbugs可以被视为静态分析的框架。您可以实施具有特定目标的新探测器。 "How To" tutorial

此外,这里有一些图书馆涵盖了你提到的目标:

More tools/libraries

答案 1 :(得分:2)

容易出错是另一个好看的工具,谷歌使用并且误报率很低,

https://github.com/google/error-prone

代码结构很好,

e.g。你可以看到here如何实现数组相等检查

答案 2 :(得分:1)

Javalib / Sawja是一个用于在Caml中为Java编写静态分析器的库。

它提供了静态分析所需的许多构建块,包括基元:

  • 解析Java字节码
  • 创建和操纵中间表示
  • 操纵个别指令,方法,类和整个程序
  • 处理类层次结构和控制流算法

文档非常好,如果我没记错的话,该发行版包含几个例子可以帮助您入门。

鉴于这一切,实现您描述的源代码指标应该快速而简单。例如,下面是一个简短的,未经测试的片段,旨在计算给定类中的方法数量:

open Sawja_pack
open Javalib_pack

let size methodmap =
  JBasics.MethodMap.fold (fun _ _ count -> count+1) methodmap 0

let main classname classpath =
  let interface_or_class  = Javalib.get_class classpath (JBasics.make_cn classname) in
  let all_concrete_methods= Javalib.get_concrete_methods interface_or_class in
  print_int (size all_concrete_methods);
  exit 0

答案 3 :(得分:0)

如果您对代码测试覆盖率的静态分析感兴趣,可以使用Eclipse的Cobertura - 和eCobertura插件。