Soot之BackwardFlowAnalysis Example

来源:互联网 发布:苹果测评电池软件 编辑:程序博客网 时间:2024/06/05 20:21

创建类extends BackwardFlowAnalysis

package Test;import soot.*;import soot.util.*;import java.util.*;import soot.jimple.*;import soot.toolkits.graph.*;import soot.toolkits.scalar.*;public class FlowAnalysisDemo extends BackwardFlowAnalysis {protected void copy(Object src, Object dest) {FlowSet srcSet = (FlowSet) src;FlowSet destSet = (FlowSet) dest;srcSet.copy(destSet);}protected void merge(Object src1, Object src2, Object dest) {FlowSet srcSet1 = (FlowSet) src1;FlowSet srcSet2 = (FlowSet) src2;FlowSet destSet = (FlowSet) dest;srcSet1.union(srcSet2, destSet);}protected void flowThrough(Object srcValue, Object unit, Object destValue) {FlowSet dest = (FlowSet) destValue;FlowSet src = (FlowSet) srcValue;Unit s = (Unit) unit;src.copy(dest);// Take out kill setIterator boxIt = s.getDefBoxes().iterator();while (boxIt.hasNext()) {ValueBox box = (ValueBox) boxIt.next();Value value = box.getValue();if (value instanceof Local)dest.remove(value);}// Add gen setboxIt = s.getUseBoxes().iterator();while (boxIt.hasNext()) {ValueBox box = (ValueBox) boxIt.next();Value value = box.getValue();if (value instanceof Local)dest.add(value);}}protected Object entryInitialFlow() {return new ArraySparseSet();}protected Object newInitialFlow() {return new ArraySparseSet();}public FlowAnalysisDemo(DirectedGraph g) {super(g);doAnalysis();}}

使用

g:UnitGraph

u:Unit

FlowAnalysisDemo fa = new FlowAnalysisDemo(g);FlowSet hsB = (FlowSet) fa.getFlowBefore(u);Iterator itb = hsB.iterator();while (itb.hasNext()) {System.out.println("Before: " + itb.next());}FlowSet hsA = (FlowSet) fa.getFlowAfter(u);Iterator ita = hsA.iterator();while (ita.hasNext()) {System.out.println("After: " + ita.next());}



1 0