NonNullParamProperty property = unconditionalDerefParamDatabase.getProperty(targetMethod.toXMethod());
ParameterNullnessProperty property = unconditionalDerefParamDatabase.getProperty(targetMethod.toXMethod());
	private void checkUnconditionallyDereferencedParam(			Location location,			ConstantPoolGen cpg,			TypeDataflow typeDataflow,			InvokeInstruction invokeInstruction,			BitSet nullArgSet, BitSet definitelyNullArgSet) throws DataflowAnalysisException, ClassNotFoundException {				// See what methods might be called here		TypeFrame typeFrame = typeDataflow.getFactAtLocation(location);		Set<JavaClassAndMethod> targetMethodSet = Hierarchy.resolveMethodCallTargets(invokeInstruction, typeFrame, cpg);		if (DEBUG_NULLARG) {			System.out.println("Possibly called methods: " + targetMethodSet);		}				// See if any call targets unconditionally dereference one of the null arguments		BitSet unconditionallyDereferencedNullArgSet = new BitSet();		List<JavaClassAndMethod> dangerousCallTargetList = new LinkedList<JavaClassAndMethod>();		List<JavaClassAndMethod> veryDangerousCallTargetList = new LinkedList<JavaClassAndMethod>();		for (JavaClassAndMethod targetMethod : targetMethodSet) {			if (DEBUG_NULLARG) {				System.out.println("For target method " + targetMethod);			}						NonNullParamProperty property = unconditionalDerefParamDatabase.getProperty(targetMethod.toXMethod());			if (property == null)				continue;			if (DEBUG_NULLARG) {				System.out.println("\tUnconditionally dereferenced params: " + property);			}						BitSet targetUnconditionallyDereferencedNullArgSet =				property.getViolatedParamSet(nullArgSet);						if (targetUnconditionallyDereferencedNullArgSet.isEmpty())				continue;						dangerousCallTargetList.add(targetMethod);						unconditionallyDereferencedNullArgSet.or(targetUnconditionallyDereferencedNullArgSet);						if (!property.getViolatedParamSet(definitelyNullArgSet).isEmpty())				veryDangerousCallTargetList.add(targetMethod);		}				if (dangerousCallTargetList.isEmpty())			return;				WarningPropertySet propertySet = new WarningPropertySet();		// See if there are any safe targets		Set<JavaClassAndMethod> safeCallTargetSet = new HashSet<JavaClassAndMethod>();		safeCallTargetSet.addAll(targetMethodSet);		safeCallTargetSet.removeAll(dangerousCallTargetList);		if (safeCallTargetSet.isEmpty()) {			propertySet.addProperty(NullArgumentWarningProperty.ALL_DANGEROUS_TARGETS);			if (dangerousCallTargetList.size() == 1) {				propertySet.addProperty(NullArgumentWarningProperty.MONOMORPHIC_CALL_SITE);			}		}				// Call to private method?  In theory there should be only one possible target.		boolean privateCall =			   safeCallTargetSet.isEmpty()			&& dangerousCallTargetList.size() == 1			&& dangerousCallTargetList.get(0).getMethod().isPrivate();				MethodGen methodGen = classContext.getMethodGen(method);		String sourceFile = classContext.getJavaClass().getSourceFileName();				String bugType;		int priority;		if (privateCall				|| invokeInstruction.getOpcode() == Constants.INVOKESTATIC				|| invokeInstruction.getOpcode() == Constants.INVOKESPECIAL) {			bugType = "NP_NULL_PARAM_DEREF_NONVIRTUAL";			priority = HIGH_PRIORITY;		} else if (safeCallTargetSet.isEmpty()) {			bugType = "NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS";			priority = NORMAL_PRIORITY;		} else {			bugType = "NP_NULL_PARAM_DEREF";			priority = LOW_PRIORITY;		}				if (dangerousCallTargetList.size() > veryDangerousCallTargetList.size())			priority++;		else			propertySet.addProperty(NullArgumentWarningProperty.ACTUAL_PARAMETER_GUARANTEED_NULL);				BugInstance warning = new BugInstance(bugType, priority)				.addClassAndMethod(methodGen, sourceFile)				.addSourceLine(classContext, methodGen, sourceFile, location.getHandle())				.addMethod(XMethodFactory.createXMethod(invokeInstruction, cpg)).describe("METHOD_CALLED");				// Check which params might be null		addParamAnnotations(definitelyNullArgSet, unconditionallyDereferencedNullArgSet, propertySet, warning);		// Add annotations for dangerous method call targets		for (JavaClassAndMethod dangerousCallTarget : veryDangerousCallTargetList) {			warning.addMethod(dangerousCallTarget).describe("METHOD_DANGEROUS_TARGET_ACTUAL_GUARANTEED_NULL");		}		dangerousCallTargetList.removeAll(veryDangerousCallTargetList);//		 Add annotations for dangerous method call targets		for (JavaClassAndMethod dangerousCallTarget : dangerousCallTargetList) {			warning.addMethod(dangerousCallTarget).describe("METHOD_DANGEROUS_TARGET");		}		// Add safe method call targets.		// This is useful to see which other call targets the analysis		// considered.		for (JavaClassAndMethod safeMethod : safeCallTargetSet) {			warning.addMethod(safeMethod).describe("METHOD_SAFE_TARGET");		}				decorateWarning(location, propertySet, warning);		bugReporter.reportBug(warning);	}