我剛開始使用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_HEAP
和ControlDependenceOptions.NONE
。但即使當我使用FULL
時,問題仍然存在。
我在做什麼錯?
謝謝!我完全錯過了Wala頁面上的警告。這是否意味着如果我需要這些語句,那麼我必須分析源代碼而不是字節碼? – Rizkallah
我想這取決於你想要達到的目標;在大多數情況下,分析這種分配並不重要,因爲它是調用對象的方法,而不是參考的存儲位置。跟蹤引用可能會成爲你和編譯器之間的戰鬥,這是一場艱苦的戰鬥。祝你好運! – StuPointerException
我想跟蹤哪個引用被用來執行方法調用,而不僅僅是方法調用自己。這就是爲什麼分配對我很重要。我想我需要對這個話題做更多的研究。再次感謝你! – Rizkallah