调用图是表示潜在的上下文敏感的调用图,通过方法的逻辑克隆构建。每个调用图节点CGNode都表示在上下文中的方法IMethod.
可以使用CallGraph.getNodes(MethodReference m)来获取方法对应的节点。
WALA支持一系列的高速算法,与流不敏感的指针分析集成。WALA还可以通过快速类型分析来构建调用图,但是使用并不好。
简单构建调用图代码如下:
AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints);
CallGraphBuilder<InstanceKey> builder = Util.makeVanillaZeroOneCFABuilder(Language.JAVA, options, new AnalysisCacheImpl(), cha);
CallGraph cg = builder.makeCallGraph(options, (MonitorUtil.IProgressMonitor)null);
(1)类CallGraphTestUtil的介绍为用于测试的调用图的实用程序。
(2)类AnalysisOptions是控制调用图生成的选项基本接口,构造函数为:AnalysisOptions(AnalysisScope scope, java.lang.Iterable<? extends Entrypoint> e)
,scope为分析域,e为分析入口。Entrypoint类的重要函数:
- addCall(AbstractRootMethod m)表示从假的根方法添加到该入口点的调用。
protected Entrypoint(IMethod method)构造方法
protected Entrypoint(MethodReference method, IClassHierarchy cha)构造方法
(3)包com.ibm.wala.ipa.callgraph.impl,这个包中提供了各种调用图构造算法所需的一些基本功能。com.ibm.wala.ipa.callgraph.impl (com.ibm.wala 1.5.8-SNAPSHOT API)https://wala.github.io/javadoc/com/ibm/wala/ipa/callgraph/impl/package-summary.html
- AllApplicationEntrypoints类,包括 分析范围内的所有应用程序方法作为入口点。构造方法如下:
所以入口点设置可以改为:
Iterable<Entrypoint> entrypoints = new AllApplicationEntrypoints(scope,cha);
- Util类,是调用图实体。其中重要的函数:
一系列makeMainEntrypoints函数,用来构建main入口点。
一系列makeRTABuilder函数,返回an RTA Call Graph builder
一系列makeZeroCFABuilder函数,返回a 0-CFA Call Graph Builder
一系列makeZeroOneCFABuilder函数,返回a 0-1-CFA Call Graph Builder
一系列makeNCFABuilder函数,返回CallGraphBuilder使用call-String上下文敏感性。。。。
- makeCallGraph所在类PropagationCallGraphBuilder
nullhttps://wala.github.io/javadoc/com/ibm/wala/ipa/callgraph/propagation/PropagationCallGraphBuilder.html这个抽象基类为调用图构建器提供了通用算法,该算法依赖于通过迭代数据流求解器的传播。此前实现是的所有点都保持活跃状态,即使是那些不跨过程的局部变量,这倒是空间效率太低,可以考虑按需要重新计算局部集。
很多东西还是不明白,等我学习深入后,搞明白再来修改。
参考链接:UserGuide:CallGraph - WalaWikihttp://wala.sourceforge.net/wiki/index.php/UserGuide:CallGraph