4

ソースコード分析タスクを実行するために 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依存するメソッド呼び出しut.getInt()がスライスに含まれているにもかかわらず、 assign ステートメントが含まれていない
  • の実装からのステートメントgetInt()は含まれていません。「手続き間」スライスを有効にするオプションはありますか? .class ファイルは、.class ファイルの作成に使用されるパスに含まれていることに注意してくださいAnalysisScope

ご覧のとおり、依存オプションにDataDependenceOptions.NO_BASE_NO_HEAPandを使用しています。ControlDependenceOptions.NONEしかしFULL、両方に使用しても問題は解決しません。

私は何を間違っていますか?

4

1 に答える 1