|| prevIns instanceof MULTIANEWARRAY) priority--;
|| prevIns instanceof MULTIANEWARRAY) { propertySet.setBoolProperty(DEAD_OBJECT_STORE, true); }  } else if (localStoreCount[local] == 2 && localLoadCount[local] > 0) {   propertySet.setBoolProperty(TWO_STORES_MULTIPLE_LOADS, true);  } else if (localStoreCount[local] == 1) {   propertySet.setBoolProperty(SINGLE_STORE, true);  } else if (localLoadCount[local] == 0) {   propertySet.setBoolProperty(NO_LOADS, true);
	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 [] localUpdateCount = 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(				localUpdateCount, 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();						// Skip any instruction which is not a store			if (!isStore(location))				continue;						// Heuristic: exception handler blocks often contain			// dead stores generated by the compiler.			propertySet.setBoolProperty(					EXCEPTION_HANDLER, location.getBasicBlock().isExceptionHandler());						IndexedInstruction ins = (IndexedInstruction) location.getHandle().getInstruction();			int local = ins.getIndex();						// Heuristic: name of local variable.			checkLocalVariableName(					method.getLocalVariableTable(),					local,					location.getHandle().getPosition());						// 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)) {				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.			propertySet.setBoolProperty(					KILLED_BY_SUBSEQUENT_STORE,					llsaDataflow.getAnalysis().killedByStore(liveStoreSet, local));						// Ignore dead assignments of null and 0.			// These often indicate defensive programming.			InstructionHandle prev = location.getBasicBlock().getPredecessorOf(location.getHandle());			propertySet.setBoolProperty(					DEFENSIVE_CONSTANT_OPCODE,					prev != null && defensiveConstantValueOpcodes.get(prev.getInstruction().getOpcode())			);						// TODO: further heuristic properties						int priority = LOW_PRIORITY;			// special handling of IINC			if (ins instanceof IINC) {								if (localIncrementCount[local] == 1) 					priority = NORMAL_PRIORITY;				else continue;							}						else if (ins instanceof ASTORE					&& prev != null) { 				Instruction prevIns = prev.getInstruction();				if ((prevIns instanceof INVOKESPECIAL &&						((INVOKESPECIAL)prevIns).getMethodName(methodGen.getConstantPool()).equals("<init>"))						|| prevIns instanceof ANEWARRAY						|| prevIns instanceof NEWARRAY						|| prevIns instanceof MULTIANEWARRAY)					priority--;			}									else if (localUpdateCount[local] == 2					&& localLoadCount[local] > 0) priority--; // raise priority			else if (localUpdateCount[local] == 1)				priority++;						else if (localLoadCount[local] == 0) priority++; // lower priority			if (parameterThatIsDeadAtEntry) {				if (DEBUG) System.out.println("Raising priority");				priority--;			}						if (priority < HIGH_PRIORITY)				priority =  HIGH_PRIORITY;			if (DEBUG) System.out.println(" considering reporting bug:" + priority);			if (priority != LOW_PRIORITY 					|| classesAlreadyReportedOn.add(javaClass.getClassName())) {								if (reportWarning()) {											// Report the bug					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("Reporting " + bugInstance);										// Encode heuristic information.					propertySet.decorateBugInstance(bugInstance, schema);										bugReporter.reportBug(bugInstance);				}			}		}	}