private boolean checkNull(FieldContext fc, FieldDefinition fd, TypeDefinition td, FieldRecord fieldRecord, int flags) { if(!Flags.testAny(flags, FieldStats.WRITE_NONNULL) && Flags.testAny(flags, FieldStats.READ)) { int priority = 0; if(fd.isFinal() && fd.isStatic()) { priority += 20; String lcName = fd.getName().toLowerCase(Locale.ENGLISH); if (lcName.contains("null") || lcName.contains("zero") || lcName.contains("empty")) { priority += 15; } } else if(fd.isPublic()) { priority += 10; } priority += tweakForSerialization(fd, td); fc.report("FieldIsAlwaysNull", priority, getWriteAnnotations(fieldRecord)); return true; } return false; }
@Override protected void visitType(TypeDefinition td) { if(!td.isPublic()) return; for(FieldDefinition fd : td.getDeclaredFields()) { if(!fd.isStatic() && !fd.isFinal() && fd.isPublic()) { getOrCreate(td); return; } } }
private boolean checkWrite(FieldContext fc, FieldDefinition fd, TypeDefinition td, FieldRecord fieldRecord, int flags, boolean isConstantType) { if(!Flags.testAny(flags, FieldStats.WRITE)) { if(fd.isStatic() && fd.isFinal() && isConstantType) return false; WarningAnnotation<?>[] anno = {}; int priority = 0; String warningType = fd.isPublic() || fd.isProtected() ? "UnwrittenPublicField" : "UnwrittenPrivateField"; if (fieldRecord != null && fieldRecord.firstRead != null) { anno = fieldRecord.firstRead.getAnnotations(); } if(fd.isPublic()) { priority += 5; } priority += tweakForSerialization(fd, td); if(fd.getFieldType().getSimpleType() == JvmType.Boolean) { priority += 5; } if(fd.getName().equalsIgnoreCase("debug")) { priority += 5; } fc.report(warningType, priority, anno); return true; } return false; }
@FieldVisitor public void visitField(FieldDefinition fd, FieldContext fc, TypeDefinition td) { if((fd.isPublic() || fd.isProtected()) && (td.isPublic() || td.isProtected()) && fd.isStatic() && !fd.isEnumConstant()) { TypeReference fieldType = fd.getFieldType(); if(!isNotThreadSafe(fieldType)) return; fc.report("StaticNotThreadSafeField", AccessLevel.of(fd).select(0, 20, 100, 100), Roles.FIELD_TYPE.create(fieldType)); } }
fc.report(fd.isPublic() || fd.isProtected() ? "UnusedPublicField" : "UnusedPrivateField", fd.isPublic() ? 5 : 0); return; return; int priority = 0; String warningType = fd.isPublic() || fd.isProtected() ? "UnreadPublicField" : "UnreadPrivateField"; if(fd.isPublic()) { priority += 5; if(fd.isFinal()) { if(!fd.isStatic() && !fd.isPublic() && fd.getName().startsWith("ref") && fd.getFieldType().getSimpleType() == JvmType.Object) { if(td.isEnum() && fieldRecord != null && !fd.isStatic()) { boolean mutable = fieldRecord.mutable; if(fd.isPublic() && (!fd.isFinal() || mutable)) { fc.report("MutableEnumField", 0, getWriteAnnotations(fieldRecord)); return; if(fd.isStatic() && (fd.isPublic() || fd.isProtected()) && (td.isPublic() || td.isProtected())) { boolean mutable = fieldRecord != null && fieldRecord.mutable; if(!fd.isFinal() && Flags.testAny(flags, FieldStats.WRITE_CONSTRUCTOR) &&