void setStaticFinalFields(Frame frame) { frame.fieldValues.forEach((mi, expr) -> { FieldDefinition fd = fields.get(mi); if(fd != null && fd.isStatic() && (fd.isFinal() || (fd.isPrivate() || fd.isPackagePrivate()) && initializedInCtor.contains(fd))) { values.put(mi, expr); } }); }
@Override public Set<Object> visitFieldDeclaration(final FieldDeclaration node, final String name) { if (_mode == NameResolveMode.EXPRESSION) { if (StringUtilities.equals(node.getName(), name)) { final FieldDefinition f = node.getUserData(Keys.FIELD_DEFINITION); if (f != null && (!_isStaticContext || f.isStatic())) { return Collections.<Object>singleton(f); } } } return Collections.emptySet(); }
@Override public Set<Object> visitFieldDeclaration(final FieldDeclaration node, final String name) { if (_mode == NameResolveMode.EXPRESSION) { if (StringUtilities.equals(node.getName(), name)) { final FieldDefinition f = node.getUserData(Keys.FIELD_DEFINITION); if (f != null && (!_isStaticContext || f.isStatic())) { return Collections.<Object>singleton(f); } } } return Collections.emptySet(); }
@Override public Set<Object> visitFieldDeclaration(final FieldDeclaration node, final String name) { if (_mode == NameResolveMode.EXPRESSION) { if (StringUtilities.equals(node.getName(), name)) { final FieldDefinition f = node.getUserData(Keys.FIELD_DEFINITION); if (f != null && (!_isStaticContext || f.isStatic())) { return Collections.<Object>singleton(f); } } } return Collections.emptySet(); }
void mergeConstructor(MethodDefinition md, Frame frame, FrameContext fc) { ctorFields.put(new MemberInfo(md), frame.fieldValues); frame.fieldValues.forEach((mi, expr) -> { FieldDefinition fd = fields.get(mi); if (fd != null && !fd.isStatic() && (fd.isFinal() || (fd.isPrivate() || fd.isPackagePrivate()) && initializedInCtor.contains(fd))) { // TODO: better merging values.merge(mi, expr, (e1, e2) -> SourceAnnotator.makePhiNode(e1, e2, fc)); } }); }
private int tweakForSerialization(FieldDefinition fd, TypeDefinition td) { // Probably field is kept for backwards serialization compatibility if(!fd.isStatic() && Types.isInstance(td, "java/io/Serializable")) { return 10; } if(Flags.testAny(fd.getFlags(), Flags.TRANSIENT)) { return 30; } return 0; }
if(md.isConstructor()) { cf.fields.forEach((mi, fd) -> { if(!fd.isStatic()) map.put(mi, getInitialExpression(fd.getFieldType().getSimpleType())); else { } else if(md.isTypeInitializer()) { cf.fields.forEach((mi, fd) -> { if(fd.isStatic()) map.put(mi, fd.getConstantValue() != null ? constant(fd.getConstantValue()) : getInitialExpression(fd.getFieldType().getSimpleType())); md.getName().equals("readObject") && md.getSignature().equals("(Ljava/io/ObjectInputStream;)V")){ cf.fields.forEach((mi, fd) -> { if(fd.isStatic()) { Expression expr = cf.values.get(mi); if(expr != null)
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; } } }
@FieldVisitor public void visitField(FieldDefinition fd, FieldContext fc) { if(fd.getName().equals("serialVersionUID")) { if(!fd.isFinal()) { fc.report("SerialVersionUidNotFinal", 0); } if(!fd.isStatic()) { fc.report("SerialVersionUidNotStatic", 0); } if(fd.getFieldType().getSimpleType() == JvmType.Integer) { fc.report("SerialVersionUidNotLong", 0); } } } }
private void checkSingleMethod(FieldContext fc, FieldDefinition fd, FieldRecord fieldRecord, int flags) { if (fullyAnalyzed && Flags.testAny(flags, FieldStats.READ) && !Flags.testAny(flags, FieldStats.READ_PACKAGE | FieldStats.READ_OUTSIDE | FieldStats.WRITE_PACKAGE | FieldStats.WRITE_OUTSIDE) && fieldRecord != null && fieldRecord.usedInSingleMethod && fieldRecord.firstWrite != null) { // javacc-generated if(fd.getName().startsWith("jj_") && fd.getDeclaringType().getSimpleName().endsWith("Parser") && fieldRecord.firstWrite.md.getName().equals("generateParseException")) return; int priority = AccessLevel.of(fd).select(10, 3, 1, 0); if(!fd.isStatic()) priority += 5; if(fieldRecord.firstWrite.md.isConstructor()) priority += 5; if(fd.getFieldType().isPrimitive()) priority += 3; fc.report("FieldUsedInSingleMethod", priority, fieldRecord.firstWrite.getAnnotations()); } }
private static boolean isSwitchMapField(final FieldReference field) { if (field == null) { return false; } final FieldDefinition definition = field instanceof FieldDefinition ? (FieldDefinition) field : field.resolve(); return definition != null && definition.isSynthetic() && definition.isStatic() && definition.isPrivate() && StringUtilities.startsWith(definition.getName(), "$SWITCH_TABLE$") && MetadataResolver.areEquivalent(BuiltinTypes.Integer.makeArrayType(), definition.getFieldType()); }
private static boolean isSwitchMapField(final FieldReference field) { if (field == null) { return false; } final FieldDefinition definition = field instanceof FieldDefinition ? (FieldDefinition) field : field.resolve(); return definition != null && definition.isSynthetic() && definition.isStatic() && definition.isPrivate() && StringUtilities.startsWith(definition.getName(), "$SWITCH_TABLE$") && MetadataResolver.areEquivalent(BuiltinTypes.Integer.makeArrayType(), definition.getFieldType()); }
private static boolean isSwitchMapField(final FieldReference field) { if (field == null) { return false; } final FieldDefinition definition = field instanceof FieldDefinition ? (FieldDefinition) field : field.resolve(); return definition != null && definition.isSynthetic() && definition.isStatic() && definition.isPrivate() && StringUtilities.startsWith(definition.getName(), "$SWITCH_TABLE$") && MetadataResolver.areEquivalent(BuiltinTypes.Integer.makeArrayType(), definition.getFieldType()); }
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())); }
if (f.isStatic() && f.isFinal() && !f.hasConstantValue()) { nv.addExistingName(f.getName());
if (f.isStatic() && f.isFinal() && !f.hasConstantValue()) { nv.addExistingName(f.getName());
if (f.isStatic() && f.isFinal() && !f.hasConstantValue()) { nv.addExistingName(f.getName());