@Override public void visit(JavaClass obj) { String name = obj.getClassName(); String[] parts = name.split("[$+.]"); baseClassName = parts[parts.length - 1]; return; classIsPublicOrProtected = obj.isPublic() || obj.isProtected(); if (Character.isLetter(baseClassName.charAt(0)) && !Character.isUpperCase(baseClassName.charAt(0)) && baseClassName.indexOf('_') == -1) { int priority = classIsPublicOrProtected ? NORMAL_PRIORITY : LOW_PRIORITY; bugReporter.reportBug(new BugInstance(this, "NM_CLASS_NAMING_CONVENTION", priority).addClass(this)); for (Field f : obj.getFields()) { if (f.getName().length() >= 2 && badFieldName(f)) { badFieldNames++; hasBadFieldNames = badFieldNames > 3 && badFieldNames > obj.getFields().length / 3; int badMethodNames = 0; for (Method m : obj.getMethods()) { if (badMethodName(m.getName())) { badMethodNames++; hasBadMethodNames = badMethodNames > 3 && badMethodNames > obj.getMethods().length / 3; isEclipseNLS = "org.eclipse.osgi.util.NLS".equals(obj.getSuperclassName()); super.visit(obj);
_outputType == BYTEARRAY_AND_FILE_OUTPUT) File outFile = getOutputFile(clazz.getClassName()); String parentDir = outFile.getParent(); if (parentDir != null) { switch (_outputType) { case FILE_OUTPUT: clazz.dump( new BufferedOutputStream( new FileOutputStream( getOutputFile(clazz.getClassName())))); break; case JAR_OUTPUT: case CLASSLOADER_OUTPUT: ByteArrayOutputStream out = new ByteArrayOutputStream(2048); clazz.dump(out); _classes.addElement(out.toByteArray()); clazz.dump(new BufferedOutputStream( new FileOutputStream(getOutputFile(clazz.getClassName())))); else if (_outputType == BYTEARRAY_AND_JAR_OUTPUT) _bcelClasses.addElement(clazz);
public void setupVisitorForClass(JavaClass obj) { constantPool = obj.getConstantPool(); thisClass = obj; ConstantClass c = (ConstantClass) constantPool.getConstant(obj.getClassNameIndex()); className = getStringFromIndex(c.getNameIndex()); dottedClassName = className.replace('/', '.'); packageName = obj.getPackageName(); sourceFile = obj.getSourceFileName(); dottedSuperclassName = obj.getSuperclassName(); superclassName = dottedSuperclassName.replace('.', '/'); ClassDescriptor cDesc = DescriptorFactory.createClassDescriptor(className); if (!FindBugs.isNoAnalysis()) { try { thisClassInfo = (ClassInfo) Global.getAnalysisCache().getClassAnalysis(XClass.class, cDesc); } catch (CheckedAnalysisException e) { throw new AssertionError("Can't find ClassInfo for " + cDesc); } } super.visitJavaClass(obj); }
@Override public void visit(JavaClass obj) { String superclassName = obj.getSuperclassName(); isSynthetic = "java.rmi.server.RemoteStub".equals(superclassName); Attribute[] attributes = obj.getAttributes(); if (attributes != null) { for (Attribute a : attributes) { if (a instanceof Synthetic) { isSynthetic = true; } } } }
private String getSlashedClassName() { return javaClass.getConstantPool().getConstantString(javaClass.getClassNameIndex(), Const.CONSTANT_Class); }
System.out.println(" Analyzing method " + classContext.getJavaClass().getClassName() + "." + method.getName()); Dataflow<BitSet, LiveLocalStoreAnalysis> llsaDataflow = classContext.getLiveLocalStoreDataflow(method); String sourceFileName = javaClass.getSourceFileName(); if (LocalVariableAnnotation.UNKNOWN_NAME.equals(lvAnnotation.getName())) { if (sourceFileName.endsWith(".groovy")) { if (storeLive && sourceLineAnnotation.getStartLine() > 0) { for (Field f : javaClass.getFields()) { if (f.getName().equals(lvName) && f.isStatic() == method.isStatic()) { shadowedField = f; propertySet.addProperty(DeadLocalStoreProperty.SHADOWS_FIELD); if (value instanceof ConstantClass) { ConstantClass v = (ConstantClass) value; initializationOf = ClassName.toSignature(v.getBytes(javaClass.getConstantPool())); foundDeadClassInitialization = true; } else if (value instanceof ObjectType) { if ("org.apache.axis.client.Stub".equals(classContext.getJavaClass().getSuperclassName())) { continue; String sourceFile = javaClass.getSourceFileName(); if (Subtypes2.isJSP(javaClass)) { propertySet.addProperty(DeadLocalStoreProperty.IN_JSP_PAGE);
throws IOException { String t; ConstantPool cp = c.getConstantPool(); int[] v = new int[cp.getLength() + 1]; out.write(linkPath(t = c.getSourceFileName())); defs.add(t); refs.add(t); out.write(linkDef(t = c.getPackageName())); defs.add(t); refs.add(t); fout.write(EOL); String aflg; out.write(aflg = Utility.accessToString(c.getAccessFlags(), true)); if (aflg != null) { out.write(SPACE); v[c.getClassNameIndex()] = 1; out.write(tagDef(t = c.getClassName())); defs.add(t); refs.add(t); v[c.getSuperclassNameIndex()] = 1; out.write(linkDef(t = c.getSuperclassName())); refs.add(t); fout.write(t); for (int i : c.getInterfaceIndices()) {
this.className = javaClass.getClassName(); this.isInterface = javaClass.isInterface(); addFeature(CLASS_NAME_KEY + transformClassName(javaClass.getClassName())); for (Method method : javaClass.getMethods()) { if (!isSynthetic(method)) { String transformedMethodSignature = transformMethodSignature(method.getSignature()); if (method.isStatic() || !overridesSuperclassMethod(javaClass, method)) { addFeature(METHOD_NAME_KEY + method.getName() + ":" + transformedMethodSignature); for (Field field : javaClass.getFields()) { if (!isSynthetic(field)) { addFeature(FIELD_NAME_KEY + field.getName() + ":" + transformSignature(field.getSignature()));
String sourceFile = classContext.getJavaClass().getSourceFileName(); if (DEBUG) { System.out.println("Checking " + methodName); int pc = handle.getPosition(); Instruction ins = handle.getInstruction(); if (value instanceof ConstantClass) { ConstantClass cc = (ConstantClass) value; constantClass = cc.getBytes(classContext.getJavaClass().getConstantPool()); pcForConstantClass = pc; int catchSize = Util.getSizeOfSurroundingTryBlock(classContext.getJavaClass().getConstantPool(), method.getCode(), "java/lang/ClassCastException", position); boolean completeInformation = (!castJavaClass.isInterface() && !refJavaClass.isInterface()) || refJavaClass.isFinal() || castJavaClass.isFinal(); if (DEBUG) { System.out.println(" In " + classContext.getFullyQualifiedMethodName(method)); System.out.println(" priority b: " + priority); if (castJavaClass.isInterface() && !castToAbstractCollection) { priority++; && (refJavaClass.isInterface() || refJavaClass.isAbstract())) { priority++;
this.className = javaClass.getClassName(); Method[] methodList = new Method[javaClass.getMethods().length]; System.arraycopy(javaClass.getMethods(), 0, methodList, 0, javaClass.getMethods().length); Arrays.sort(methodList, (o1, o2) -> { int cmp = o1.getName().compareTo(o2.getName()); if (cmp != 0) { return cmp; return o1.getSignature().compareTo(o2.getSignature()); Field[] fieldList = new Field[javaClass.getFields().length]; System.arraycopy(javaClass.getFields(), 0, fieldList, 0, javaClass.getFields().length); Arrays.sort(fieldList, (o1, o2) -> { int cmp = o1.getName().compareTo(o2.getName()); if (cmp != 0) { return cmp; return o1.getSignature().compareTo(o2.getSignature()); });
@Override public void visit(JavaClass obj) { try { methodMap.clear(); badOverrideMap.clear(); JavaClass superClass = obj.getSuperClass(); if (superClass == null) { return; } String packageName = superClass.getPackageName(); String className = superClass.getClassName(); // A more generic way to add Adapters would be nice here isAdapter = ((className.endsWith("Adapter")) && ("java.awt.event".equals(packageName) || "javax.swing.event".equals(packageName))) || (("DefaultHandler".equals(className) && ("org.xml.sax.helpers".equals(packageName)))); if (isAdapter) { Method[] methods = superClass.getMethods(); for (Method method1 : methods) { methodMap.put(method1.getName(), method1.getSignature()); } } } catch (ClassNotFoundException cnfe) { bugReporter.reportMissingClass(cnfe); } }
public static Method findImplementation(JavaClass clazz, String name, String signature) { Method[] m = clazz.getMethods(); for (Method aM : m) { if (aM.getName().equals(name) && aM.getSignature().equals(signature) && !aM.isPrivate() && !aM.isStatic()) { return aM; } } return null; } }
Code code = obj.getCode(); Method realVoidConstructor = findVoidConstructor(getThisClass()); if (code != null && !markedAsNotUsable(obj)) { if (codeDoesSomething(code)) { priority--; } else if (!obj.isPublic() && getThisClass().isPublic()) { priority--; for (Method m : this.getThisClass().getMethods()) { if (!m.isStatic() && m != obj && !isVoidConstructor(getThisClass(), m)) { instanceMembers = true; for (Field f : this.getThisClass().getFields()) { if (!f.isStatic()) { instanceMembers = true; bugReporter.reportBug(new BugInstance(this, "NM_METHOD_CONSTRUCTOR_CONFUSION", priority).addClassAndMethod(this) .lowerPriorityIfDeprecated()); return;
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); } } }
public static boolean isJSP(JavaClass javaClass) { @DottedClassName String className = javaClass.getClassName(); if ( className.endsWith("_jsp") || className.endsWith("_tag")) { return true; } for(Method m : javaClass.getMethods()) { if (m.getName().startsWith("_jsp")) { return true; } } for(Field f : javaClass.getFields()) { if (f.getName().startsWith("_jsp")) { return true; } } return Subtypes2.instanceOf(className, "javax.servlet.jsp.JspPage") || Subtypes2.instanceOf(className, "org.apache.jasper.runtime.HttpJspBase") || Subtypes2.instanceOf(className, "javax.servlet.jsp.tagext.SimpleTagSupport") || Subtypes2.instanceOf(className, " org.apache.jasper.runtime.JspSourceDependent"); }
@Override public void visitAfter(JavaClass obj) { if (!obj.isClass()) { return; int accessFlags = obj.getAccessFlags(); if ((accessFlags & Const.ACC_INTERFACE) != 0) { return; visibleOutsidePackage = obj.isPublic() || obj.isProtected(); if (usesDefaultHashCode || obj.isAbstract()) { priority++; if (obj.isAbstract()) { priority++; String superclassName = obj.getSuperclassName(); if ("java.lang.Enum".equals(superclassName)) { bugPattern = "EQ_DONT_DEFINE_EQUALS_FOR_ENUM"; BugInstance bug = new BugInstance(this, "EQ_COMPARETO_USE_OBJECT_EQUALS", obj.isAbstract() ? Priorities.LOW_PRIORITY .get(new ClassAnnotation(obj.getClassName())); if (equalsKind == EqualsKindSummary.KindOfEquals.ALWAYS_FALSE) { return; if (equalsMethodIsInstanceOfEquals) { priority += 2; } else if (obj.isAbstract() || !hasEqualsObject) {
calledMethods = new HashSet<>(); calledMethodNames = new HashSet<>(); className = classContext.getJavaClass().getClassName(); String[] parts = className.split("[$+.]"); String simpleClassName = parts[parts.length - 1]; ConstantPool cp = classContext.getJavaClass().getConstantPool(); for(Constant constant : cp.getConstantPool()) { if(constant instanceof ConstantMethodHandle) { int kind = ((ConstantMethodHandle) constant).getReferenceKind(); if(kind >= 5 && kind <= 9) { Constant ref = cp.getConstant(((ConstantMethodHandle)constant).getReferenceIndex()); if(ref instanceof ConstantCP) { String className = cp.getConstantString(((ConstantCP) ref).getClassIndex(), Const.CONSTANT_Class); ConstantNameAndType nameAndType = (ConstantNameAndType) cp.getConstant(((ConstantCP) ref).getNameAndTypeIndex()); String name = ((ConstantUtf8)cp.getConstant(nameAndType.getNameIndex())).getBytes(); String signature = ((ConstantUtf8)cp.getConstant(nameAndType.getSignatureIndex())).getBytes(); MethodAnnotation called = new MethodAnnotation(ClassName.toDottedClassName(className), name, signature, kind==6 /* invokestatic */); calledMethods.add(called); priority = NORMAL_PRIORITY; BugInstance bugInstance = new BugInstance(this, "UPM_UNCALLED_PRIVATE_METHOD", priority).addClass(this).addMethod(m); bugReporter.reportBug(bugInstance);
@Override public void visitField(Field obj) { if (obj.isProtected()) { bugReporter.reportBug(new BugInstance(this, "CI_CONFUSED_INHERITANCE", LOW_PRIORITY).addClass(cls).addField( new FieldAnnotation(cls.getClassName(), obj.getName(), obj.getSignature(), obj.isStatic()))); } }
@Override public void visit(Field obj) { int flags = obj.getAccessFlags(); String genericSignature = obj.getGenericSignature(); if (genericSignature != null && genericSignature.startsWith("T")) { return; System.out.println("SE_BAD_FIELD: " + getThisClass().getClassName() + " " + obj.getName() + " " + isSerializable + " " + implementsSerializableDirectly + " " + sawSerialVersionUID + " " + isGUIClass + " " + isEjbImplClass); if ("this$0".equals(obj.getName())) { fieldWarningList.add(new BugInstance(this, "SE_BAD_FIELD_INNER_CLASS", priority).addClass(getThisClass() .getClassName())); } else if (isSerializable < 0.9) { fieldWarningList.add(new BugInstance(this, "SE_BAD_FIELD", priority) .addClass(getThisClass().getClassName()) .addField(xfield).addType(problemType) .describe("TYPE_FOUND")); } else if (!isGUIClass && !isEjbImplClass && !isJSPClass && "this$0".equals(obj.getName())) { fieldWarningList.add(new BugInstance(this, "SE_INNER_CLASS", implementsSerializableDirectly ? NORMAL_PRIORITY : LOW_PRIORITY).addClass(getThisClass().getClassName()));