1 19 20 package edu.umd.cs.findbugs.detect; 21 22 import java.util.Iterator ; 23 24 import org.apache.bcel.Constants; 25 import org.apache.bcel.classfile.Method; 26 import org.apache.bcel.generic.ConstantPoolGen; 27 import org.apache.bcel.generic.FieldInstruction; 28 import org.apache.bcel.generic.Instruction; 29 import org.apache.bcel.generic.ReferenceType; 30 import org.apache.bcel.generic.Type; 31 32 import edu.umd.cs.findbugs.BugReporter; 33 import edu.umd.cs.findbugs.Detector; 34 import edu.umd.cs.findbugs.TrainingDetector; 35 import edu.umd.cs.findbugs.ba.AnalysisContext; 36 import edu.umd.cs.findbugs.ba.CFG; 37 import edu.umd.cs.findbugs.ba.CFGBuilderException; 38 import edu.umd.cs.findbugs.ba.ClassContext; 39 import edu.umd.cs.findbugs.ba.DataflowAnalysisException; 40 import edu.umd.cs.findbugs.ba.Hierarchy; 41 import edu.umd.cs.findbugs.ba.Location; 42 import edu.umd.cs.findbugs.ba.XField; 43 import edu.umd.cs.findbugs.ba.type.FieldStoreType; 44 import edu.umd.cs.findbugs.ba.type.FieldStoreTypeDatabase; 45 import edu.umd.cs.findbugs.ba.type.TypeDataflow; 46 import edu.umd.cs.findbugs.ba.type.TypeFrame; 47 48 55 public class TrainFieldStoreTypes implements Detector, TrainingDetector { 56 private BugReporter bugReporter; 57 private FieldStoreTypeDatabase database; 58 59 public TrainFieldStoreTypes(BugReporter bugReporter) { 60 this.bugReporter = bugReporter; 61 this.database = new FieldStoreTypeDatabase(); 62 } 63 64 public void visitClassContext(ClassContext classContext) { 65 Method[] methodList = classContext.getJavaClass().getMethods(); 66 for (Method method : methodList) { 67 if (method.getCode() == null) 68 continue; 69 70 try { 71 analyzeMethod(classContext, method); 72 } catch (CFGBuilderException e) { 73 bugReporter.logError("Error compting field store types", e); 74 } catch (DataflowAnalysisException e) { 75 bugReporter.logError("Error compting field store types", e); 76 } catch (ClassNotFoundException e) { 77 bugReporter.reportMissingClass(e); 78 } 79 } 80 } 81 82 private void analyzeMethod(ClassContext classContext, Method method) 83 throws CFGBuilderException, DataflowAnalysisException, ClassNotFoundException { 84 CFG cfg = classContext.getCFG(method); 85 TypeDataflow typeDataflow = classContext.getTypeDataflow(method); 86 ConstantPoolGen cpg = classContext.getConstantPoolGen(); 87 88 for (Iterator <Location> i = cfg.locationIterator(); i.hasNext();) { 89 Location location = i.next(); 90 Instruction ins = location.getHandle().getInstruction(); 91 short opcode = ins.getOpcode(); 92 93 if (opcode != Constants.PUTFIELD && opcode != Constants.PUTSTATIC) 95 continue; 96 97 FieldInstruction fins = (FieldInstruction) ins; 99 Type fieldType = fins.getType(cpg); 100 if (!(fieldType instanceof ReferenceType)) 101 continue; 102 103 XField xfield = Hierarchy.findXField(fins, cpg); 105 if (xfield == null) 106 continue; 107 108 if (xfield.isPublic() || xfield.isProtected()) 111 continue; 112 113 TypeFrame frame = typeDataflow.getFactAtLocation(location); 116 if (!frame.isValid()) 117 continue; 118 Type storeType = frame.getTopValue(); 119 if (!(storeType instanceof ReferenceType)) 120 continue; 121 122 FieldStoreType property = database.getProperty(xfield); 124 if (property == null) { 125 property = new FieldStoreType(); 126 database.setProperty(xfield, property); 127 } 128 129 property.addTypeSignature(storeType.getSignature()); 131 } 132 } 133 134 public void report() { 135 AnalysisContext.currentAnalysisContext().storePropertyDatabase( 136 database, FieldStoreTypeDatabase.DEFAULT_FILENAME, "store type database"); 137 } 138 139 } 140 | Popular Tags |