if (FindBugs.DEBUG) { System.out.println("    Analyzing method " + method.toString()); }
	private void analyzeMethod(ClassContext classContext, Method method)			throws DataflowAnalysisException, CFGBuilderException {				JavaClass javaClass = classContext.getJavaClass();				Dataflow<BitSet, LiveLocalStoreAnalysis> llsaDataflow =			classContext.getLiveLocalStoreDataflow(method);				int numLocals = method.getCode().getMaxLocals();		int [] localStoreCount = new int[numLocals];		int [] localLoadCount = new int[numLocals];		int [] localIncrementCount = new int[numLocals];		MethodGen methodGen = classContext.getMethodGen(method);		CFG cfg = classContext.getCFG(method);		BitSet liveStoreSetAtEntry = llsaDataflow.getAnalysis().getResultFact(cfg.getEntry());		BitSet complainedAbout = new BitSet();				// Get number of locals that are parameters.		int localsThatAreParameters = method.getArgumentTypes().length;		if (!method.isStatic()) localsThatAreParameters++;				// Scan method to determine number of loads, stores, and increments		// of local variables.		countLocalStoresLoadsAndIncrements(				localStoreCount, localLoadCount, localIncrementCount, cfg);				// Scan method for		// - dead stores		// - stores to parameters that are dead upon entry to the method		for (Iterator<Location> i = cfg.locationIterator(); i.hasNext(); ) {			Location location = i.next();						WarningPropertySet propertySet = new WarningPropertySet();			// Skip any instruction which is not a store			if (!isStore(location))				continue;						// Heuristic: exception handler blocks often contain			// dead stores generated by the compiler.			if (location.getBasicBlock().isExceptionHandler())				propertySet.addProperty(DeadLocalStoreProperty.EXCEPTION_HANDLER);						IndexedInstruction ins = (IndexedInstruction) location.getHandle().getInstruction();			int local = ins.getIndex();						// Heuristic: name of local variable.			checkLocalVariableName(					method.getLocalVariableTable(),					local,					location.getHandle().getPosition(),					propertySet);						// Is this a store to a parameter which was dead on entry to the method?			boolean parameterThatIsDeadAtEntry = local < localsThatAreParameters				&& !llsaDataflow.getAnalysis().isStoreAlive(liveStoreSetAtEntry, local);			if (parameterThatIsDeadAtEntry && !complainedAbout.get(local)) {				// TODO: add warning properties?				BugInstance bugInstance = new BugInstance(this, "IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN", NORMAL_PRIORITY)					.addClassAndMethod(methodGen, javaClass.getSourceFileName())					.addSourceLine(methodGen, javaClass.getSourceFileName(), location.getHandle());				bugReporter.reportBug(bugInstance);				complainedAbout.set(local);			}						// Get live stores at this instruction.			// Note that the analysis also computes which stores were			// killed by a subsequent unconditional store.			BitSet liveStoreSet = llsaDataflow.getAnalysis().getFactAtLocation(location);						// Is store alive?			if (llsaDataflow.getAnalysis().isStoreAlive(liveStoreSet, local))				continue;			// Store is dead						// Ignore assignments that were killed by a subsequent assignment.			boolean killedBySubsequentStore = llsaDataflow.getAnalysis().killedByStore(liveStoreSet, local);			if (killedBySubsequentStore)				propertySet.addProperty(DeadLocalStoreProperty.KILLED_BY_SUBSEQUENT_STORE);						// Ignore dead assignments of null and 0.			// These often indicate defensive programming.			InstructionHandle prev = location.getBasicBlock().getPredecessorOf(location.getHandle());			int prevOpCode = -1;			if (prev != null					&& defensiveConstantValueOpcodes.get(prev.getInstruction().getOpcode())) {				propertySet.addProperty(DeadLocalStoreProperty.DEFENSIVE_CONSTANT_OPCODE);				prevOpCode = prev.getInstruction().getOpcode();				}                        InstructionHandle prev2 = prev == null ? null : prev.getPrev();			if (prev2 != null                                && prev2.getInstruction() instanceof ALOAD                                && prev.getInstruction() instanceof GETFIELD)				propertySet.addProperty(DeadLocalStoreProperty.CACHING_VALUE);						if (ins instanceof IINC) {				// special handling of IINC								propertySet.addProperty(DeadLocalStoreProperty.DEAD_INCREMENT);				if (localIncrementCount[local] == 1) {					propertySet.addProperty(DeadLocalStoreProperty.SINGLE_DEAD_INCREMENT);				}							} else if (ins instanceof ASTORE && prev != null) { 				// Look for objects created but never used								Instruction prevIns = prev.getInstruction();				if ((prevIns instanceof INVOKESPECIAL &&						((INVOKESPECIAL)prevIns).getMethodName(methodGen.getConstantPool()).equals("<init>"))						|| prevIns instanceof ANEWARRAY						|| prevIns instanceof NEWARRAY						|| prevIns instanceof MULTIANEWARRAY) {					propertySet.addProperty(DeadLocalStoreProperty.DEAD_OBJECT_STORE);				}							} else if (!killedBySubsequentStore				    && localStoreCount[local] == 2 && localLoadCount[local] > 0) {				// TODO: why is this significant?								propertySet.addProperty(DeadLocalStoreProperty.TWO_STORES_MULTIPLE_LOADS);							} else if (!parameterThatIsDeadAtEntry && localStoreCount[local] == 1) {				// TODO: why is this significant?								propertySet.addProperty(DeadLocalStoreProperty.SINGLE_STORE);							} else if (!parameterThatIsDeadAtEntry && localLoadCount[local] == 0) {				// TODO: why is this significant?								propertySet.addProperty(DeadLocalStoreProperty.NO_LOADS);							}						if (parameterThatIsDeadAtEntry) {				propertySet.addProperty(DeadLocalStoreProperty.PARAM_DEAD_ON_ENTRY);			}			if (localStoreCount[local] > 3) 				propertySet.addProperty(DeadLocalStoreProperty.MANY_STORES);			int priority = propertySet.computePriority(NORMAL_PRIORITY);			if (priority <= Detector.EXP_PRIORITY) {					// Report the warning				BugInstance bugInstance = new BugInstance(this, "DLS_DEAD_LOCAL_STORE", priority)					.addClassAndMethod(methodGen, javaClass.getSourceFileName())					.addSourceLine(methodGen, javaClass.getSourceFileName(), location.getHandle());				if (DEBUG) {				System.out.println(					javaClass.getSourceFileName() + " : " +						methodGen.getName());				System.out.println("priority: " + priority);				System.out.println("Reporting " + bugInstance);				System.out.println(propertySet);				}								// If in relaxed reporting mode, encode heuristic information.				if (AnalysisContext.currentAnalysisContext().getBoolProperty(						FindBugsAnalysisProperties.RELAXED_REPORTING_MODE)) {					// Add general-purpose warning properties					WarningPropertyUtil.addPropertiesForLocation(							propertySet,							classContext,							method,							location);										// Turn all warning properties into BugProperties					propertySet.decorateBugInstance(bugInstance);				}								bugReporter.reportBug(bugInstance);			}		}	}