我通过以下一系列调用获得com.ibm.wala.ipa.callgraph.propagation.cfa.CallString
:
从CallString
,我可以分别获得com.ibm.wala.classLoader.CallSiteReference
和com.ibm.wala.classLoader.IMethod
的数组。对于(可能)字符串中的每个调用,我想知道调用的接收器的com.ibm.wala.ipa.callgraph.propagation.InstanceKey
。最好的方法是什么?
我可以看到关于这个的一种(也许是原始的)方式是我可以检索"程序员计数器"来自CallString
的号码。例如,代码:
public static void main(String[] args){
Stream o1=new ArrayList<>().stream();
BaseStream o2=o1.unordered();
}
这是与调用unordered()
时创建的对象分配对应的节点:
Node: < Primordial, Ljava/util/stream/ReferencePipeline, unordered()Ljava/util/stream/Stream; >
从节点中提取的Context
,它是使用nCFA生成的,其中n = 2:
CallStringContext: [ java.util.stream.ReferencePipeline$Head.unordered()Ljava/util/stream/BaseStream;@1 p.B.main([Ljava/lang/String;)V@12 ]
12似乎是调用main()
的{{1}}方法中的程序计数器。这是相同代码的SSA表单:
unordered()
由此,我们可以看到程序计数器12处的指令确实是对Instructions:
BB0
BB1
0 v3 = new <Application,Ljava/util/ArrayList>@0(line 10)
BB2
2 invokespecial < Application, Ljava/util/ArrayList, <init>()V > v3 @4 exception:v4(line 10)
BB3
3 v6 = invokevirtual < Application, Ljava/util/ArrayList, stream()Ljava/util/stream/Stream; > v3 @7 exception:v5(line 10)
BB4
6 v8 = invokeinterface < Application, Ljava/util/stream/Stream, unordered()Ljava/util/stream/BaseStream; > v6 @12 exception:v7(line 11) {6=[o1]}
...
的调用。我们还可以看到接收器是unordered()
。所以,至少在这里我们知道,通过使用SSA和调用图的组合,IR变量代表实例接收器。然而,问题仍然是可以通过这种方式获得接收器对象的v6
吗?