2015-10-05 50 views
3

我剛開始使用Wala Java切片器來做一些源代碼分析任務。我對圖書館的正確使用有一個疑問。假設我有以下示例代碼:Wala Java切片器 - 從切片丟失的語句

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

計算爲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 

的代碼我使用的創建與瓦剌切片如下圖所示:

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.getInt()ut = userType,包括在片
  • getInt()實施的任何聲明都包括在內。是否有激活「程序間」切片的選項?我在這裏應該提到.class文件包含在用於創建AnalysisScope的路徑中。

正如你所看到的,我使用的依賴選項DataDependenceOptions.NO_BASE_NO_HEAPControlDependenceOptions.NONE。但即使當我使用FULL時,問題仍然存在。

我在做什麼錯?

回答

1

的賦值語句UT =即使 相關的方法調用ut.getInt(),包括在片

我懷疑是分配從來沒有做它成字節碼不包括USERTYPE因爲它是一個未要求的局部變量,因此是不可見的,以WALA:

由於SSA IR已經有所優化,一些 語句,例如簡單的分配(X = Y,Y = Z)做不出現在 IR,由於複製傳播優化在SSBuilder類的 SSA構建期間自動完成。實際上,沒有SSA 分配指令;另外,javac編譯器可以自由地執行這些優化,因此這些語句甚至不會出現在 字節碼中。因此,這些Java語句將永遠不會出現在切片中。

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

+0

謝謝!我完全錯過了Wala頁面上的警告。這是否意味着如果我需要這些語句,那麼我必須分析源代碼而不是字節碼? – Rizkallah

+0

我想這取決於你想要達到的目標;在大多數情況下,分析這種分配並不重要,因爲它是調用對象的方法,而不是參考的存儲位置。跟蹤引用可能會成爲你和編譯器之間的戰鬥,這是一場艱苦的戰鬥。祝你好運! – StuPointerException

+0

我想跟蹤哪個引用被用來執行方法調用,而不僅僅是方法調用自己。這就是爲什麼分配對我很重要。我想我需要對這個話題做更多的研究。再次感謝你! – Rizkallah