private FieldDefinition getField(Expression expr, MethodDefinition md) { if (!md.isStatic() && expr.getCode() == AstCode.PutField) { FieldDefinition fd = ((FieldReference) expr.getOperand()).resolve(); if (fd != null && !fd.isSynthetic() && (fd.isPrivate() || fd.isPackagePrivate() || fd.isProtected())) { if (md.isProtected() && fd.isProtected()) return null; Expression self = Exprs.getChild(expr, 0); if (!Exprs.isThis(self)) return null; return fd; } } if (expr.getCode() == AstCode.PutStatic) { FieldDefinition fd = ((FieldReference) expr.getOperand()).resolve(); if (fd != null && !fd.isSynthetic() && (fd.isPrivate() || fd.isPackagePrivate())) { return fd; } } return null; }
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)); } }
@AstVisitor(nodes = AstNodes.EXPRESSIONS) public void visit(Expression expr, NodeChain nc, MethodContext mc, MethodDefinition md, Mutability m) { FieldDefinition fd = getField(expr, md); if (fd == null) return; Expression value = Exprs.getChild(expr, expr.getArguments().size() - 1); ParameterDefinition pd = getParameter(value); if (pd == null) return; if (!Types.isMutable(fd.getFieldType()) && !m.isKnownMutable(fd.getFieldType())) return; int priority = 0; if (md.isProtected() || fd.isProtected()) priority += 10; if (md.isVarArgs() && pd.getPosition() == md.getParameters().size() - 1) priority += 10; if (nc.getParent() == null && nc.getRoot().getBody().size() == 1) priority += 15; else if (!fd.isFinal()) priority += 3; String type = fd.isStatic() ? "ExposeMutableStaticFieldViaParameter" : "ExposeMutableFieldViaParameter"; mc.report(type, priority, expr, Roles.FIELD_TYPE.create(fd.getFieldType())); }
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.isStatic() && (fd.isPublic() || fd.isProtected()) && (td.isPublic() || td.isProtected())) { boolean mutable = fieldRecord != null && fieldRecord.mutable; if(!fd.isFinal() && Flags.testAny(flags, FieldStats.WRITE_CONSTRUCTOR) &&