本文主要是介绍Soot数据流 -- 数据流框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.数据流分析框架关键步骤。
个人的问题:
- 什么叫做数据流分析?
- 为何将下列问题作为关键步骤?
关键问题及步骤(soot生存手册中提到):
1.1. 决定分析的本质是什么:是否向前后者向后的数据分析?是否考虑分支,还是不进行考虑?等等
1.2. 确定自己想进行如何粗略的估计:是可能的分析还是必不可少的分析?从效果上看,你需要决定,在合并通过一个节点的信息的时候,你是需要进行结合还是切断?
1.3. 执行实际上的流: 本质上是为每一个处于中间状态的 声明 建立方程式。—— 如:任务声明应该如何被操作?
1.4. 确定初始的状态,或者入口节点的近似(如果是回溯的流程,那么是出口节点) 以及 中间节点——(或者是空集,或者是全集,这取决于分析的粒度。)
2.数据流分析理解
2.1.程序中语句与数据分析之间的关系
- 【语句 = 加工厂】每个语句相当于一个小的加工厂,加工厂加工需要一定的原料(输入 in),并且会产生一定的效果(输出 out)。
- 【在soot中的体现】out = in - kll +gen,这个公式反映了数据流分析的本质,这让数据在语句中真正流动起来(在数据流分析中)。
- 【in】in表示接受的输入,因为一条语句前面会有其他的语句,因为当前语句是建立在之前语句的基础之上的,所以需要通过in 来指代之前语句的成果。
- 【kill,gen】 kill和gen是主要依赖于语句本身的。比如说,a = 100这个语句的作用是将a中之前的值抹去(kill),同时放入 100的值(gen)。
- 【out】out反映的是语句处理之后造成的后果。
附:
(1) out = in - kill + gen ,在soot中的体现:
protected void flowThrough(Object in, Object node, Object out) { FlowSet inSet = (FlowSet)source, outSet = (FlowSet)dest; Unit u = (Unit)node; kill(inSet, u, outSet); gen(outSet, u); }
更具体的代码示例: 过程内数据流分析示例
这篇关于Soot数据流 -- 数据流框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!