1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.io.IOException ; 23 import java.util.Iterator ; 24 25 import org.apache.bcel.classfile.ClassParser; 26 import org.apache.bcel.classfile.JavaClass; 27 import org.apache.bcel.classfile.Method; 28 import org.apache.bcel.generic.InstructionHandle; 29 import org.apache.bcel.generic.MethodGen; 30 31 import edu.umd.cs.findbugs.annotations.CheckForNull; 32 33 public abstract class ResourceValueAnalysisTestDriver <Resource, ResourceTrackerType extends ResourceTracker<Resource>> { 34 35 public abstract ResourceTrackerType createResourceTracker(ClassContext classContext, Method method) 36 throws CFGBuilderException, DataflowAnalysisException; 37 38 public void execute(String classFile, String methodName, int offset) 39 throws IOException , CFGBuilderException, DataflowAnalysisException { 40 41 final RepositoryLookupFailureCallback lookupFailureCallback = new DebugRepositoryLookupFailureCallback(); 42 43 AnalysisContext analysisContext = AnalysisContext.create(lookupFailureCallback); 45 46 JavaClass jclass = new ClassParser(classFile).parse(); 47 ClassContext classContext = analysisContext.getClassContext(jclass); 48 49 Method[] methodList = jclass.getMethods(); 50 for (Method method : methodList) { 51 if (!method.getName().equals(methodName)) 52 continue; 53 54 CFG cfg = classContext.getCFG(method); 55 56 BasicBlock creationBlock = null; 57 InstructionHandle creationInstruction = null; 58 59 blockLoop: 60 for (Iterator <BasicBlock> ii = cfg.blockIterator(); ii.hasNext();) { 61 BasicBlock basicBlock = ii.next(); 62 for (Iterator <InstructionHandle> j = basicBlock.instructionIterator(); j.hasNext();) { 63 InstructionHandle handle = j.next(); 64 if (handle.getPosition() == offset) { 65 creationBlock = basicBlock; 66 creationInstruction = handle; 67 break blockLoop; 68 } 69 } 70 } 71 72 if (creationInstruction == null || creationBlock == null) throw new IllegalArgumentException ("No bytecode with offset " + offset); 73 74 final ResourceTrackerType resourceTracker = createResourceTracker(classContext, method); 75 final Resource resource = 76 resourceTracker.isResourceCreation(creationBlock, creationInstruction, classContext.getConstantPoolGen()); 77 78 if (resource == null) 79 throw new IllegalArgumentException ("offset " + offset + " is not a resource creation"); 80 81 DataflowTestDriver<ResourceValueFrame, ResourceValueAnalysis<Resource>> driver = 82 new DataflowTestDriver<ResourceValueFrame, ResourceValueAnalysis<Resource>>() { 83 @Override @CheckForNull 84 public Dataflow<ResourceValueFrame, ResourceValueAnalysis<Resource>> createDataflow(ClassContext classContext, Method method) 85 throws CFGBuilderException, DataflowAnalysisException { 86 MethodGen methodGen = classContext.getMethodGen(method); 87 if (methodGen == null) return null; 88 CFG cfg = classContext.getCFG(method); 89 DepthFirstSearch dfs = classContext.getDepthFirstSearch(method); 90 91 ResourceValueAnalysis<Resource> analysis = 92 new ResourceValueAnalysis<Resource>(methodGen, cfg, dfs, resourceTracker, resource); 93 Dataflow<ResourceValueFrame, ResourceValueAnalysis<Resource>> dataflow = 94 new Dataflow<ResourceValueFrame, ResourceValueAnalysis<Resource>>(cfg, analysis); 95 dataflow.execute(); 96 97 return dataflow; 98 } 99 }; 100 101 driver.execute(classContext, method); 102 break; 103 } 104 } 105 } 106 107 | Popular Tags |