Wala Java Slicer - 来自切片的缺失语句

时间:2015-10-05 13:23:04

标签: java program-slicing

我刚开始使用Wala Java Slicer来完成一些源代码分析任务。我对正确使用该库有疑问。假设我有以下示例代码:

public void main(String[] args) {
    ...
    UserType ut = userType;
    int i = ut.getInt();
    ...
    System.out.println(i);
}

使用Wala计算println语句的切片给出以下语句:

NORMAL_RET_CALLER:Node: < Application, LRTExecutionClass, main([Ljava/lang/String;)V > Context: Everywhere[15]13 = invokevirtual < Application, LUserType, getInt()I > 11 @27 exception:12
NORMAL main:23 = getstatic < Application, Ljava/lang/System, out, <Application,Ljava/io/PrintStream> > Node: < Application, LRTExecutionClass, main([Ljava/lang/String;)V > Context: Everywhere
NORMAL main:invokevirtual < Application, Ljava/io/PrintStream, println(I)V > 23,13 @63 exception:24 Node: < Application, LRTExecutionClass, main([Ljava/lang/String;)V > Context: Everywhere

我用来创建Wala切片的代码如下所示:

AnalysisScope scope = AnalysisScopeReader.readJavaScope("...", 
                            null, WalaJavaSlicer.class.getClassLoader());
ClassHierarchy cha = ClassHierarchy.make(scope);

Iterable<Entrypoint> entrypoints = Util.makeMainEntrypoints(scope, cha);
AnalysisOptions options = new AnalysisOptions(scope, entrypoints);

// Build the call graph
CallGraphBuilder cgb = Util.makeZeroCFABuilder(options, new AnalysisCache(),cha, scope, null, null);
CallGraph cg = cgb.makeCallGraph(options, null);
PointerAnalysis pa = cgb.getPointerAnalysis();

// Find seed statement
Statement statement = findCallTo(findMainMethod(cg), "println");

// Context-sensitive thin slice
Collection<Statement> slice = Slicer.computeBackwardSlice(statement, cg, pa, DataDependenceOptions.NO_BASE_NO_HEAP, ControlDependenceOptions.NONE);
dumpSlice(slice);

我希望在切片中找到许多语句,但不存在:

  • 即使依赖方法调用ut = userType,IS包含在切片
  • 中,也不包括赋值语句ut.getInt()
  • 不包含getInt()实施的陈述。有没有激活“程序间”切片的选项?我在这里应该提到.class文件包含在用于创建AnalysisScope
  • 的路径中

如您所见,我使用DataDependenceOptions.NO_BASE_NO_HEAPControlDependenceOptions.NONE作为依赖选项。但即使我对两者都使用FULL,问题仍然存在。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

  

即使是,也不包括assign语句ut = userType   依赖方法调用ut.getInt(),IS包含在切片

我怀疑赋值永远不会进入字节代码,因为它是一个不需要的局部变量,因此对于WALA是不可见的:

  

因为SSA IR已经稍微优化了一些   诸如简单赋值(x = y,y = z)之类的语句不会出现在   IR,由于在期间自动完成复制传播优化   由SSABuilder类构建的SSA。事实上,没有SSA   分配指令;另外,javac编译器是免费的   这些优化,所以语句甚至可能不出现在   字节码。因此,这些Java语句永远不会出现在切片中。

http://wala.sourceforge.net/wiki/index.php/UserGuide:Slicer#Warning:_exclusion_of_copy_statements_from_slice