@Override public FieldReference visitField(final FieldReference f, final Map<TypeReference, TypeReference> map) { final TypeReference oldFieldType = f.getFieldType(); final TypeReference newFieldType = visit(oldFieldType, map); final TypeReference declaringType = f.getDeclaringType(); private final String _name = f.getName(); private final TypeReference _type = newFieldType;
private static boolean equiFields(final FieldReference left, final FieldReference right) { return StringUtilities.equals(left.getFullName(), right.getFullName()); }
static TypeReference getFieldType(final FieldReference field) { final FieldDefinition resolvedField = field.resolve(); if (resolvedField != null) { final FieldReference asMember = MetadataHelper.asMemberOf(resolvedField, field.getDeclaringType()); return asMember.getFieldType(); } return substituteTypeArguments(field.getFieldType(), field); }
private String createUniqueStrForReference(Object reference) { String uniqueStr = null; if (reference instanceof TypeReference) { TypeReference type = (TypeReference) reference; String pathAndTypeStr = getPathAndTypeStr(type); if (pathAndTypeStr != null) { uniqueStr = "type|" + pathAndTypeStr; } } else if (reference instanceof MethodReference) { MethodReference method = (MethodReference) reference; String pathAndTypeStr = getPathAndTypeStr(method.getDeclaringType()); if (pathAndTypeStr != null) { uniqueStr = "method|" + pathAndTypeStr + "|" + method.getName() + "|" + method.getErasedSignature(); } } else if (reference instanceof FieldReference) { FieldReference field = (FieldReference) reference; String pathAndTypeStr = getPathAndTypeStr(field.getDeclaringType()); if (pathAndTypeStr != null) { uniqueStr = "field|" + pathAndTypeStr + "|" + field.getName(); } } return uniqueStr; }
private static String makeKey(final FieldReference field) { return field.getFullName() + ":" + field.getErasedSignature(); }
public FieldReferenceEntry getFieldReference(final FieldReference field) { final TypeInfoEntry typeInfo = getTypeInfo(field.getDeclaringType()); final NameAndTypeDescriptorEntry nameAndDescriptor = getNameAndTypeDescriptor( field.getName(), field.getErasedSignature() ); _lookupKey.set(Tag.FieldReference, typeInfo.index, nameAndDescriptor.index); Entry entry = _entryMap.get(_lookupKey); if (entry == null) { if (isFrozen()) { return null; } entry = new FieldReferenceEntry(this, typeInfo.index, nameAndDescriptor.index); } _lookupKey.clear(); return (FieldReferenceEntry) entry; }
final Expression target = (Expression) firstOrDefault(match.get("target")); final FieldReference reference = (FieldReference) target.getUserData(Keys.MEMBER_REFERENCE); final FieldDefinition definition = reference.resolve(); StringUtilities.equals(context.getCurrentType().getInternalName(), reference.getDeclaringType().getInternalName())) { _initializers.put(reference.getFullName(), node);
public FieldDefinition resolve() { final TypeReference declaringType = getDeclaringType(); if (declaringType == null) { throw ContractUtils.unsupported(); } return declaringType.resolve(this); }
if(expr.getCode() == AstCode.PutStatic) { FieldReference fr = (FieldReference) expr.getOperand(); FieldDefinition fd = fr.resolve(); if(fd != null && fd.isSynthetic()) return; priority += 5; String name = fr.getName().toLowerCase(Locale.ENGLISH); if (fr.getFieldType().getSimpleType() == JvmType.Boolean) { priority += 10; if (name.contains("verbose"))
private void checkFieldRead(Expression expr, MethodContext mc) { if (Nodes.isFieldRead(expr)) { FieldDefinition fd = ((FieldReference) expr.getOperand()).resolve(); if (fd != null && !Flags.testAny(fd.getFlags(), Flags.VOLATILE)) { mc.report("SpinLoopOnField", 0, expr, Roles.FIELD.create(fd)); } } } }
static FieldDefinition getField(final List<FieldDefinition> candidates, final FieldReference reference) { for (int i = 0, n = candidates.size(); i < n; i++) { final FieldDefinition candidate = candidates.get(i); if (StringComparator.Ordinal.equals(candidate.getName(), reference.getName())) { final TypeReference referenceType = reference.getFieldType(); final TypeReference candidateType = candidate.getFieldType(); if (areEquivalent(candidateType, referenceType)) { return candidate; } final TypeReference rawCandidateType = MetadataHelper.eraseRecursive(candidateType); final TypeReference rawReferenceType = MetadataHelper.eraseRecursive(referenceType); if ((rawCandidateType != candidateType || rawReferenceType != referenceType) && areEquivalent(rawCandidateType, rawReferenceType)) { return candidate; } } } return null; }
@Override protected StringBuilder appendErasedSignature(final StringBuilder sb) { return getFieldType().appendErasedSignature(sb); }
private static boolean isAssertionStatusCheck(Expression expr) { if(expr.getCode() != AstCode.LogicalNot) return false; Expression arg = expr.getArguments().get(0); if(arg.getCode() != AstCode.GetStatic) return false; FieldReference fr = (FieldReference) arg.getOperand(); return fr.getName().startsWith("$assertions"); }
@AstVisitor(nodes = AstNodes.EXPRESSIONS, methodName = "equals", methodSignature = "(Ljava/lang/Object;)Z") public void visitEqualsExpression(Expression expr, MethodContext mc) { if(isComparison(expr)) { Expression left = expr.getArguments().get(0); Expression right = expr.getArguments().get(1); if(left.getCode() == AstCode.GetField && right.getCode() == AstCode.GetField) { FieldReference lfr = ((FieldReference) left.getOperand()); FieldReference rfr = ((FieldReference) right.getOperand()); if(!lfr.isEquivalentTo(rfr)) { lfr = lfr.resolve(); rfr = rfr.resolve(); // TODO: do not warn about comparisons like if(a == o.a && b == o.b || a == o.b && b == o.a) if(lfr != null && rfr != null && !lfr.isEquivalentTo(rfr)) { if (Exprs.bothMatch(Exprs.getChild(left, 0), Exprs.getChild(right, 0), Exprs::isThis, EqualsContract::isParameter)) { mc.report("EqualsSuspiciousFieldComparison", 0, left, OTHER_FIELD.create(rfr)); } } } } if (expr.getCode() == AstCode.InvokeVirtual && Methods.isEqualsMethod((MethodReference) expr.getOperand())) { checkGetName(expr, mc, left); checkGetName(expr, mc, right); } } }
@Override public boolean isEquivalentTo(final MemberReference member) { if (super.isEquivalentTo(member)) { return true; } if (member instanceof FieldReference) { final FieldReference field = (FieldReference) member; return StringUtilities.equals(field.getName(), this.getName()) && MetadataResolver.areEquivalent(field.getDeclaringType(), this.getDeclaringType()); } return false; }
public FieldReferenceEntry getFieldReference(final FieldReference field) { final TypeInfoEntry typeInfo = getTypeInfo(field.getDeclaringType()); final NameAndTypeDescriptorEntry nameAndDescriptor = getNameAndTypeDescriptor( field.getName(), field.getErasedSignature() ); _lookupKey.set(Tag.FieldReference, typeInfo.index, nameAndDescriptor.index); Entry entry = _entryMap.get(_lookupKey); if (entry == null) { if (isFrozen()) { return null; } entry = new FieldReferenceEntry(this, typeInfo.index, nameAndDescriptor.index); } _lookupKey.clear(); return (FieldReferenceEntry) entry; }
final Expression target = (Expression) firstOrDefault(match.get("target")); final FieldReference reference = (FieldReference) target.getUserData(Keys.MEMBER_REFERENCE); final FieldDefinition definition = reference.resolve(); StringUtilities.equals(context.getCurrentType().getInternalName(), reference.getDeclaringType().getInternalName())) { _initializers.put(reference.getFullName(), node);
public FieldDefinition resolve() { final TypeReference declaringType = getDeclaringType(); if (declaringType == null) { throw ContractUtils.unsupported(); } return declaringType.resolve(this); }
@AstVisitor(nodes=AstNodes.EXPRESSIONS) public void visitCode(Expression expr, NodeChain nc, MethodContext mc, MethodDefinition md, TypeDefinition td) { if(expr.getCode() == AstCode.PutField) { FieldDefinition fd = ((FieldReference) expr.getOperand()).resolve(); if (fd.getDeclaringType().isEquivalentTo(td) && !nc.isSynchronized() && !Flags.testAny(fd.getFlags(), Flags.VOLATILE) && reportedFields.add(fd)) { mc.report("MutableServletField", 0, expr); } } } }
static FieldDefinition getField(final List<FieldDefinition> candidates, final FieldReference reference) { for (int i = 0, n = candidates.size(); i < n; i++) { final FieldDefinition candidate = candidates.get(i); if (StringComparator.Ordinal.equals(candidate.getName(), reference.getName())) { final TypeReference referenceType = reference.getFieldType(); final TypeReference candidateType = candidate.getFieldType(); if (candidateType.isGenericParameter() && !referenceType.isGenericParameter()) { if (areEquivalent(MetadataHelper.getUpperBound(candidateType), referenceType)) { return candidate; } } else { if (areEquivalent(candidateType, referenceType)) { return candidate; } } } } return null; }