Lambda 表达式的烟尘调用图

问题描述

我想使用 Soot 创建一个调用图,它可以将 lambda 主体识别为可访问。

更准确地说,我想让 Soot 绘制下面示例的调用图。

public class TestLambda3 {

    public static void main(String[] args) {
        method1();
    }

    public static void method1() {
        List<TestLambda3> list = Arrays.asList(new TestLambda3(),new TestLambda3());
        list.stream().forEach(x -> x.foo());
    }



    public void foo() {
        bar();
    }

    public void bar() {
        System.out.println("hi1");
    }


}

在这里,我期望调用图将包含从 main 一直到 foobar 的路径,在中间调用 lambda。我不确定为什么这条路不存在。我可以想象这是因为在 ```java.util." 中调用了 accept 方法的调用,但我不想分析整个 java.util.,任何简单的Soot 在不分析 JDK 的情况下处理这个问题的方法?

我的烟灰配置是

 G.reset();
        Options options = Options.v();
        options.set_whole_program(true);
        options.set_verbose(true);
        options.setPhaseOption("jb","use-original-names:true");
        options.set_keep_line_number(true);
        options.setPhaseOption("cg.cha","enabled:true");
​
        options.set_allow_phantom_refs(true);
        options.set_no_bodies_for_excluded(true);
        options.set_soot_classpath(String.join(":",Arrays.asList(Objects.requireNonNull(config.getTargetJar()))));
        options.set_process_dir(Arrays.asList(config.getTargetJar()));
        options.set_prepend_classpath(true);
        Scene.v().loadNecessaryClasses();
        SootClass c = Scene.v().forceResolve("TestLambda3",SootClass.BODIES);
        c.setApplicationClass();
        SootMethod method = c.getMethod("void main(java.lang.String[])");
        List entryPoints = new ArrayList();
        entryPoints.add(method);
        Scene.v().setEntryPoints(entryPoints);
        PackManager.v().getPack("wjpp").apply();
        PackManager.v().getPack("cg").apply();

生成的调用图为:

STATIC edge: staticinvoke <TestLambda3: void method1()>() in <TestLambda3: void main(java.lang.String[])> ==> <TestLambda3: void method1()>
CLINIT edge: list = staticinvoke <java.util.Arrays: java.util.List asList(java.lang.Object[])>($stack1) in <TestLambda3: void method1()> ==> <java.util.Arrays: void <clinit>()>
STATIC edge: $stack8 = staticinvoke <TestLambda3$lambda_method1_0__1: java.util.function.Consumer bootstrap$()>() in <TestLambda3: void method1()> ==> <TestLambda3$lambda_method1_0__1: java.util.function.Consumer bootstrap$()>
STATIC edge: list = staticinvoke <java.util.Arrays: java.util.List asList(java.lang.Object[])>($stack1) in <TestLambda3: void method1()> ==> <java.util.Arrays: java.util.List asList(java.lang.Object[])>
CLINIT edge: list = staticinvoke <java.util.Arrays: java.util.List asList(java.lang.Object[])>($stack1) in <TestLambda3: void method1()> ==> <java.lang.Object: void <clinit>()>
CLINIT edge: staticinvoke <java.lang.Object: void registerNatives()>() in <java.lang.Object: void <clinit>()> ==> <java.lang.Object: void <clinit>()>
STATIC edge: staticinvoke <java.lang.Object: void registerNatives()>() in <java.lang.Object: void <clinit>()> ==> <java.lang.Object: void registerNatives()>
SPECIAL edge: specialinvoke $stack2.<TestLambda3: void <init>()>() in <TestLambda3: void method1()> ==> <TestLambda3: void <init>()>
SPECIAL edge: specialinvoke $stack4.<TestLambda3: void <init>()>() in <TestLambda3: void method1()> ==> <TestLambda3: void <init>()>
SPECIAL edge: specialinvoke $r0.<TestLambda3$lambda_method1_0__1: void <init>()>() in <TestLambda3$lambda_method1_0__1: java.util.function.Consumer bootstrap$()> ==> <TestLambda3$lambda_method1_0__1: void <init>()>
SPECIAL edge: specialinvoke this.<java.lang.Object: void <init>()>() in <TestLambda3: void <init>()> ==> <java.lang.Object: void <init>()>
FINALIZE edge: null in <java.lang.Object: void <init>()> ==> <java.lang.Object: void finalize()>
SPECIAL edge: specialinvoke $r0.<java.lang.Object: void <init>()>() in <TestLambda3$lambda_method1_0__1: void <init>()> ==> <java.lang.Object: void <init>()>

有关如何解决此问题的任何建议?谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...