List<WarningWithProperties> stringComparisonList) throws DataflowAnalysisException {
List<WarningWithProperties> stringComparisonList, List<WarningWithProperties> refComparisonList) throws DataflowAnalysisException {
	private void checkRefComparison(			Location location,			JavaClass jclass,			MethodGen methodGen,			RefComparisonTypeFrameModelingVisitor visitor,			TypeDataflow typeDataflow,			List<WarningWithProperties> stringComparisonList) throws DataflowAnalysisException {		InstructionHandle handle = location.getHandle();		TypeFrame frame = typeDataflow.getFactAtLocation(location);		if (frame.getStackDepth() < 2)			throw new DataflowAnalysisException("Stack underflow", methodGen, handle);		int numSlots = frame.getNumSlots();		Type lhsType = frame.getValue(numSlots - 1);		Type rhsType = frame.getValue(numSlots - 2);		if (lhsType instanceof ReferenceType && rhsType instanceof ReferenceType) {			String lhs = SignatureConverter.convert(lhsType.getSignature());			String rhs = SignatureConverter.convert(rhsType.getSignature());			if (!lhs.equals(rhs))				return;			if (lhs.equals("java.lang.String") && rhs.equals("java.lang.String")) {				if (DEBUG)					System.out.println("String/String comparison at " +					        handle);				// Compute the priority:				// - two static strings => do not report				// - dynamic string and anything => high				// - static string and unknown => medium				// - all other cases => low				// System.out.println("Compare " + lhsType + " == " + rhsType);				byte type1 = lhsType.getType();				byte type2 = rhsType.getType();				// T1 T2 result				// S  S  no-op				// D  ?  high				// ?  D  high				// S  ?  normal				// ?  S  normal								WarningPropertySet propertySet = new WarningPropertySet();								if (type1 == T_STATIC_STRING && type2 == T_STATIC_STRING) {					//priority = LOW_PRIORITY + 1;					propertySet.addProperty(RefComparisonWarningProperty.COMPARE_STATIC_STRINGS);				} else if (type1 == T_DYNAMIC_STRING || type2 == T_DYNAMIC_STRING) {					//priority = HIGH_PRIORITY;					propertySet.addProperty(RefComparisonWarningProperty.DYNAMIC_AND_UNKNOWN);				} else if (type1 == T_STATIC_STRING || type2 == T_STATIC_STRING) {					//priority = LOW_PRIORITY;					propertySet.addProperty(RefComparisonWarningProperty.STATIC_AND_UNKNOWN);				} else if (visitor.sawStringIntern()) {					//priority = LOW_PRIORITY;					propertySet.addProperty(RefComparisonWarningProperty.SAW_INTERN);				}				String sourceFile = jclass.getSourceFileName();				BugInstance instance =					new BugInstance(this, "ES_COMPARING_STRINGS_WITH_EQ", NORMAL_PRIORITY)					.addClassAndMethod(methodGen, sourceFile)					.addSourceLine(methodGen, sourceFile, handle)					.addClass("java.lang.String").describe("CLASS_REFTYPE");				WarningWithProperties warn = new WarningWithProperties(instance, propertySet);								stringComparisonList.add(warn);								stringComparisonList.add(new WarningWithProperties(						instance, propertySet));			} else if (suspiciousSet.contains(lhs) && suspiciousSet.contains(rhs)) {				String sourceFile = jclass.getSourceFileName();				BugInstance instance = new BugInstance(this, "RC_REF_COMPARISON", NORMAL_PRIORITY)				        .addClassAndMethod(methodGen, sourceFile)				        .addSourceLine(methodGen, sourceFile, handle)				        .addClass(lhs).describe("CLASS_REFTYPE");				if (REPORT_ALL_REF_COMPARISONS)					bugReporter.reportBug(instance);				else if (refComparison == null)					refComparison = instance;			}		}	}