Expression load = expr.getArguments().get(0); return load.getCode() == AstCode.GetField && ((FieldReference) load.getOperand()).isEquivalentTo((MemberReference) store.getOperand()) && Equi.equiExpressions(store.getArguments().get(0), load.getArguments().get(0)); Expression load = expr.getArguments().get(0); return load.getCode() == AstCode.GetStatic && ((FieldReference) load.getOperand()).isEquivalentTo((MemberReference) store.getOperand());
@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); } } }
if (Exprs.findExpression(Exprs.getChild(e2, 1), ex -> ex.getCode() == AstCode.GetField && fr.isEquivalentTo((FieldReference) ex.getOperand()) && Nodes.isEquivalent(Exprs.getChildNoSpecial(ex, 0), receiver)) != null) break; Expression receiver2 = Exprs.getChildNoSpecial(e2, 0); FieldReference fr2 = (FieldReference) e2.getOperand(); if(fr.isEquivalentTo(fr2) && Nodes.isEquivalent(receiver, receiver2)) { int priority = 0; if(md.isConstructor() && nc == null && Exprs.isThis(receiver2))
@AstVisitor(nodes=AstNodes.EXPRESSIONS) public void visit(Expression expr, NodeChain nc, MethodContext mc) { if(expr.getCode() == AstCode.PutField || expr.getCode() == AstCode.PutStatic) { FieldReference fr = (FieldReference) expr.getOperand(); while(nc != null) { Expression syncObject = nc.getSyncObject(); if(syncObject != null) { if(syncObject.getCode() == AstCode.GetField && expr.getCode() == AstCode.PutField) { FieldReference sfr = (FieldReference) syncObject.getOperand(); if(sfr.isEquivalentTo(fr) && Nodes.isEquivalent(Nodes.getChild(expr, 0), Nodes.getChild(syncObject, 0))) { mc.report("SynchronizationOnUpdatedField", 0, expr); } } else if(syncObject.getCode() == AstCode.GetStatic && expr.getCode() == AstCode.PutStatic) { FieldReference sfr = (FieldReference) syncObject.getOperand(); if(sfr.isEquivalentTo(fr)) { mc.report("SynchronizationOnUpdatedField", 0, expr); } } } nc = nc.getParent(); } } } }
&& fr.isEquivalentTo((FieldReference) src.getOperand()) ? fc.makeUpdatedNode(src) : src); target = target.replaceField(fr, fc.makeUpdatedNode(prevExpr)); return target.replaceAll(src -> src.getCode() == AstCode.GetStatic && fr.isEquivalentTo((FieldReference) src.getOperand()) ? fc.makeUpdatedNode(src) : src); && fr.isEquivalentTo((FieldReference) src.getOperand()) ? fc.makeUpdatedNode(src) : src); .getCode() == AstCode.GetStatic && fr.isEquivalentTo((FieldReference) src.getOperand()) ? fc.makeUpdatedNode(src) : src);