⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resolveallreferences.java

📁 A static analysis tool to find bugs in Java programs
💻 JAVA
字号:
package edu.umd.cs.findbugs.detect;import edu.umd.cs.findbugs.*;import edu.umd.cs.findbugs.ba.*;import edu.umd.cs.findbugs.ba.ch.Subtypes;import edu.umd.cs.findbugs.visitclass.PreorderVisitor;import java.util.*;import org.apache.bcel.Repository;import org.apache.bcel.classfile.*;public class ResolveAllReferences extends PreorderVisitor implements Detector {	private BugReporter bugReporter;	public ResolveAllReferences(BugReporter bugReporter) {		this.bugReporter = bugReporter;	}	Set<String> defined;	private void compute() {		if (defined == null) {			// System.out.println("Computing");			defined = new HashSet<String>();			Subtypes subtypes = AnalysisContext.currentAnalysisContext()					.getSubtypes();			Set<JavaClass> allClasses;			allClasses = subtypes.getAllClasses();			for (JavaClass c : allClasses)				addAllDefinitions(c);			// System.out.println("Done Computing: " + defined.contains("edu.umd.cs.findbugs.ba.IsNullValueAnalysis.UNKNOWN_VALUES_ARE_NSP : Z"));		}	}	public void visitClassContext(ClassContext classContext) {		classContext.getJavaClass().accept(this);	}	public void report() {	}	public void addAllDefinitions(JavaClass obj) {		String className2 = obj.getClassName();		defined.add(className2);		for (Method m : obj.getMethods())			if (!m.isPrivate()) {				String name = getMemberName(obj, className2, m.getNameIndex(),						m.getSignatureIndex());				defined.add(name);			}		for (Field f : obj.getFields())			if (!f.isPrivate()) {				String name = getMemberName(obj, className2, f.getNameIndex(), f						.getSignatureIndex());				defined.add(name);			}	}	private String getClassName(JavaClass c, int classIndex) {		String name = c.getConstantPool().getConstantString(classIndex,				CONSTANT_Class);		return Subtypes.extractClassName(name).replace('/','.');	}	private String getMemberName(JavaClass c, String className,			int memberNameIndex, int signatureIndex) {		return className				+ "."				+ ((ConstantUtf8) c.getConstantPool().getConstant(						memberNameIndex, CONSTANT_Utf8)).getBytes()						+ " : "						+ ((ConstantUtf8) c.getConstantPool().getConstant(						signatureIndex, CONSTANT_Utf8)).getBytes();	}	private String getMemberName(String className,			String memberName, String signature) {		return className.replace('/','.')				+ "."				+ memberName						+ " : "						+ signature;	}	private boolean find(JavaClass target, String name, String signature) throws ClassNotFoundException {		if (target == null) return false;		String ref = getMemberName(target.getClassName(), name,				signature);		if (defined.contains(ref)) return true;		if (find(target.getSuperClass(), name, signature)) return true;		for(JavaClass i : target.getInterfaces())			if (find(i, name, signature)) return true;		return false;	}	@Override		 public void visit(JavaClass obj) {		compute();		ConstantPool cp = obj.getConstantPool();		Constant[] constants = cp.getConstantPool();		checkConstant: for (int i = 0; i < constants.length; i++) {			Constant co = constants[i];			if (co instanceof ConstantDouble || co instanceof ConstantLong)				i++;			if (co instanceof ConstantClass) {				String ref = getClassName(obj, i);				if ((ref.startsWith("java") || ref.startsWith("org.w3c.dom")) && !defined.contains(ref))					bugReporter.reportBug(new BugInstance(this, "VR_UNRESOLVABLE_REFERENCE", NORMAL_PRIORITY)							.addClass(obj).addString(ref));			} else if (co instanceof ConstantFieldref) {				// do nothing until we handle static fields defined in interfaces			} else if (co instanceof ConstantCP) {				ConstantCP co2 = (ConstantCP) co;				String className = getClassName(obj, co2.getClassIndex());				// System.out.println("checking " + ref);				if (className.equals(obj.getClassName())						|| !defined.contains(className)) {					// System.out.println("Skipping check of " + ref);					continue checkConstant;				}				ConstantNameAndType nt = (ConstantNameAndType) cp				.getConstant(co2.getNameAndTypeIndex());				String name = ((ConstantUtf8) obj.getConstantPool().getConstant(						nt.getNameIndex(), CONSTANT_Utf8)).getBytes();				String signature = ((ConstantUtf8) obj.getConstantPool().getConstant(						nt.getSignatureIndex(), CONSTANT_Utf8)).getBytes();				try {					JavaClass target = Repository.lookupClass(className);					if (! find(target, name, signature))						bugReporter.reportBug(new BugInstance(this, "VR_UNRESOLVABLE_REFERENCE", NORMAL_PRIORITY)							.addClass(obj).addString(getMemberName(target.getClassName(), name,									signature)));				} catch (ClassNotFoundException e) {					bugReporter.reportMissingClass(e);				}			}		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -