private boolean badFieldName(Field obj) { String fieldName = obj.getName(); return !obj.isFinal() && Character.isLetter(fieldName.charAt(0)) && !Character.isLowerCase(fieldName.charAt(0)) && fieldName.indexOf('_') == -1 && Character.isLetter(fieldName.charAt(1)) && Character.isLowerCase(fieldName.charAt(1)); }
@Override public void visit(Field obj) { super.visit(obj); if (obj.isFinal()) { finalFields.add(obj.getName()); } }
@Override public void visit(Field obj) { if ("this$0".equals(obj.getName())) { isInnerClass = true; } if (!obj.isFinal() && !obj.isStatic() && !BCELUtil.isSynthetic(obj)) { hasNonFinalFields = true; } }
@Override public void visit(Field obj) { if (!obj.isFinal() && !obj.isTransient() && !obj.isVolatile()) { bugReporter.reportBug(new BugInstance(this, "JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS", NORMAL_PRIORITY).addClass( this).addVisitedField(this)); } }
private void handleLoad(FieldInstruction obj) { consumeStack(obj); Type type = obj.getType(getCPG()); if (!STRING_SIGNATURE.equals(type.getSignature())) { throw new IllegalArgumentException("type is not String: " + type); } try { String className = obj.getClassName(getCPG()); String fieldName = obj.getName(getCPG()); Field field = Hierarchy.findField(className, fieldName); if (field != null) { // If the field is final, we'll assume that the String value // is static. if (field.isFinal()) { pushValue(staticStringTypeInstance); } else { pushValue(type); } return; } } catch (ClassNotFoundException ex) { lookupFailureCallback.reportMissingClass(ex); } pushValue(type); } }
maskingField.isStatic()); int priority = NORMAL_PRIORITY; if (maskingField.isStatic() || maskingField.isFinal()) { priority++; } else if (fld.getSignature().charAt(0) == 'L' && !fld.getSignature().startsWith("Ljava/lang/")
int priority = aField.isPublic() && aField.isFinal() && aField.getName().equals(aField.getName().toUpperCase()) && getThisClass().isPublic() ? HIGH_PRIORITY : NORMAL_PRIORITY; if (classOfField != null) {
private boolean badFieldName(Field obj) { String fieldName = obj.getName(); return !obj.isFinal() && Character.isLetter(fieldName.charAt(0)) && !Character.isLowerCase(fieldName.charAt(0)) && fieldName.indexOf('_') == -1 && Character.isLetter(fieldName.charAt(1)) && Character.isLowerCase(fieldName.charAt(1)); }
@Override public void visit(Field obj) { super.visit(obj); if (obj.isFinal()) { finalFields.add(obj.getName()); } }
@Override public void visit(Field obj) { if ("this$0".equals(obj.getName())) { isInnerClass = true; } if (!obj.isFinal() && !obj.isStatic() && !BCELUtil.isSynthetic(obj)) { hasNonFinalFields = true; } }
@Override public void visit(Field field) { if (!field.isFinal() && Objects.equal(field.getSignature(), "Lorg/slf4j/Logger;")) { BugInstance bug = new BugInstance(this, "SLF4J_LOGGER_SHOULD_BE_FINAL", NORMAL_PRIORITY) .addString(field.getName()) .addField(this) .addClass(this); bugReporter.reportBug(bug); } }
@Override public void visit(Field obj) { if (!obj.isFinal() && !obj.isTransient() && !obj.isVolatile()) { bugReporter.reportBug(new BugInstance(this, "JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS", NORMAL_PRIORITY).addClass( this).addVisitedField(this)); } }
/** * implements the visitor to look for fields that are public static final and are the same type as the owning class. it collects these object names for * later * * @param obj * the context object of the currently parsed field */ @Override public void visitField(Field obj) { if (obj.isStatic() && obj.isPublic() && obj.isFinal()) { JavaClass cls = getClassContext().getJavaClass(); if (!obj.isEnum()) { String fieldClass = obj.getSignature(); if (fieldClass.startsWith(Values.SIG_QUALIFIED_CLASS_PREFIX)) { fieldClass = SignatureUtils.trimSignature(fieldClass); String clsClass = cls.getClassName(); if (fieldClass.equals(clsClass)) { enumConstNames.add(obj.getName()); super.visitField(obj); } } } } }
private void handleLoad(FieldInstruction obj) { consumeStack(obj); Type type = obj.getType(getCPG()); if (!STRING_SIGNATURE.equals(type.getSignature())) { throw new IllegalArgumentException("type is not String: " + type); } try { String className = obj.getClassName(getCPG()); String fieldName = obj.getName(getCPG()); Field field = Hierarchy.findField(className, fieldName); if (field != null) { // If the field is final, we'll assume that the String value // is static. if (field.isFinal() && field.isFinal()) { pushValue(staticStringTypeInstance); } else { pushValue(type); } return; } } catch (ClassNotFoundException ex) { lookupFailureCallback.reportMissingClass(ex); } pushValue(type); } }
/** * implements the visitor to look for fields that are public static final and are the same type as the owning class. it collects these object names for * later * * @param obj * the context object of the currently parsed field */ @Override public void visitField(Field obj) { if (obj.isStatic() && obj.isPublic() && obj.isFinal()) { JavaClass cls = getClassContext().getJavaClass(); if (!obj.isEnum()) { String fieldClass = obj.getSignature(); if (fieldClass.startsWith(Values.SIG_QUALIFIED_CLASS_PREFIX)) { fieldClass = SignatureUtils.trimSignature(fieldClass); String clsClass = cls.getClassName(); if (fieldClass.equals(clsClass)) { enumConstNames.add(obj.getName()); super.visitField(obj); } } } } }
int priority = aField.isPublic() && aField.isFinal() && aField.getName().equals(aField.getName().toUpperCase()) && getThisClass().isPublic() ? HIGH_PRIORITY : NORMAL_PRIORITY; if (classOfField != null) {
/** Checks if the constraints of operands of the said instruction(s) are satisfied. */ public void visitPUTSTATIC(PUTSTATIC o){ String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (int i=0; i<fields.length; i++){ if (fields[i].getName().equals(field_name)){ f = fields[i]; break; } } if (f == null){ throw new AssertionViolatedException("Field not found?!?"); } if (f.isFinal()){ if (!(myOwner.getClassName().equals(o.getClassType(cpg).getClassName()))){ constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+myOwner.getClassName()+"' which is not the case: it is declared in '"+o.getClassType(cpg).getClassName()+"'."); } } if (! (f.isStatic())){ constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); } String meth_name = Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getName(); // If it's an interface, it can be set only in <clinit>. if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); } }
if (f.isFinal()) { if (!(myOwner.getClassName().equals(getObjectType(o).getClassName()))) { constraintViolated(o,
/** * checks to see if the class is Serializable, then looks for fields that are both final and transient * * @param classContext * the context object of the currently parsed class */ @Override public void visitClassContext(ClassContext classContext) { try { JavaClass cls = classContext.getJavaClass(); if ((serializableClass != null) && (cls.implementationOf(serializableClass))) { Field[] fields = cls.getFields(); setupVisitorForClass(cls); for (Field f : fields) { if (!f.isStatic() && f.isFinal() && f.isTransient()) { bugReporter.reportBug(new BugInstance(this, BugType.NFF_NON_FUNCTIONAL_FIELD.name(), Priorities.NORMAL_PRIORITY).addClass(this) .addField(cls.getClassName(), f.getName(), f.getSignature(), f.getAccessFlags())); } } } } catch (ClassNotFoundException cnfe) { bugReporter.reportMissingClass(cnfe); } }
/** * checks to see if the class is Serializable, then looks for fields that are both final and transient * * @param classContext * the context object of the currently parsed class */ @Override public void visitClassContext(ClassContext classContext) { try { JavaClass cls = classContext.getJavaClass(); if ((serializableClass != null) && (cls.implementationOf(serializableClass))) { Field[] fields = cls.getFields(); setupVisitorForClass(cls); for (Field f : fields) { if (!f.isStatic() && f.isFinal() && f.isTransient()) { bugReporter.reportBug(new BugInstance(this, BugType.NFF_NON_FUNCTIONAL_FIELD.name(), Priorities.NORMAL_PRIORITY).addClass(this) .addField(cls.getClassName(), f.getName(), f.getSignature(), f.getAccessFlags())); } } } } catch (ClassNotFoundException cnfe) { bugReporter.reportMissingClass(cnfe); } }