@Override public void visitIdentifier(IdentifierTree tree) { if (!referenceSymbol && symbol.equals(tree.symbol())) { referenceSymbol = true; } super.visitIdentifier(tree); } }
private static void handleIdentifier(Set<Symbol> out, Set<Tree> assignmentLHS, IdentifierTree element) { Symbol symbol = element.symbol(); if (!assignmentLHS.contains(element) && isLocalVariable(symbol)) { out.add(symbol); } }
private void checkExpression(ExpressionTree expressionTree) { IdentifierTree variable = getVariable(expressionTree); if (variable != null && staticFields.contains(variable.symbol())) { assignedStaticFields.add(variable); } }
private void checkStore(ExpressionTree expression) { if (expression.is(Tree.Kind.IDENTIFIER)) { IdentifierTree identifierTree = (IdentifierTree) expression; if (!parametersStack.isEmpty() && parametersStack.peek().contains(identifierTree.symbol())) { context.reportIssue(this, identifierTree, "Store a copy of \"" + identifierTree.name() + "\"."); } } }
private void visitMethodInvocationWithIdentifierTarget(final String methodName, final IdentifierTree target) { if (!isMemberSelectActingOnField(target)) { final SymbolicValue symbolicValue = programState.getValue(target.symbol()); if (LOCK_METHOD_NAME.equals(methodName) || TRY_LOCK_METHOD_NAME.equals(methodName)) { programState = programState.addConstraintTransitively(symbolicValue, LockConstraint.LOCKED); } else if (UNLOCK_METHOD_NAME.equals(methodName)) { programState = programState.addConstraintTransitively(symbolicValue, LockConstraint.UNLOCKED); } } } }
@Override public void visitIdentifier(IdentifierTree tree) { super.visitIdentifier(tree); checkSymbol(tree.symbol()); }
private void checkForEachIdentifier(Map<Symbol, Integer> forEachSymbols, IdentifierTree node) { Symbol symbol = node.symbol(); if (symbol.owner().isMethodSymbol()) { if (forEachSymbols.containsKey(symbol)) { addIssue(node, forEachSymbols.get(symbol)); } else { forEachSymbols.put(symbol, ((JavaTree) node).getLine()); } } }
@CheckForNull private static ExpressionTree getInitializer(IdentifierTree tree) { Symbol symbol = tree.symbol(); if (symbol.isVariableSymbol()) { VariableTree declaration = ((Symbol.VariableSymbol) symbol).declaration(); if (declaration != null) { return declaration.initializer(); } } return null; }
@Override public void visitIdentifier(IdentifierTree tree) { if (tree.symbol().isUnknown()) { unresolvedIdentifierNames.add(tree.name()); } super.visitIdentifier(tree); } }
@Override protected void onMethodReferenceFound(MethodReferenceTree methodReferenceTree) { String methodName = methodReferenceTree.method().symbol().name(); reportIssue(methodReferenceTree.method(), "Replace this with a call to the \"toFile()." + messageParam.get(methodName) + "()\" method"); } }
@CheckForNull private static Symbol invocationTarget(MethodInvocationTree mit) { ExpressionTree methodSelect = mit.methodSelect(); if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { ExpressionTree methodSelectExpression = ((MemberSelectExpressionTree) methodSelect).expression(); if (methodSelectExpression.is(Tree.Kind.IDENTIFIER)) { return ((IdentifierTree) methodSelectExpression).symbol(); } } return null; }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { ExpressionTree variable = tree.variable(); if (variable.is(Tree.Kind.IDENTIFIER)) { IdentifierTree identifier = (IdentifierTree) variable; Symbol reference = identifier.symbol(); if (reference.isVariableSymbol() && variables.contains(reference)) { context.reportIssue(this, identifier, "Introduce a new variable instead of reusing the parameter \"" + identifier.name() + "\"."); } } }
@CheckForNull private static ExpressionTree getPreparedStatementReference(MethodInvocationTree mit) { ExpressionTree methodSelect = mit.methodSelect(); if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { ExpressionTree expression = ((MemberSelectExpressionTree) methodSelect).expression(); if (expression.is(Tree.Kind.IDENTIFIER)) { Symbol referenceSymbol = ((IdentifierTree) expression).symbol(); return ReassignmentFinder.getClosestReassignmentOrDeclarationExpression(mit, referenceSymbol); } } return null; }
private void handleMethodReference(MethodReferenceTree methodRef) { Tree expression = methodRef.expression(); if (ADD.matches(methodRef.method().symbol())) { checkExpression(methodRef, expression); } }
private static boolean isStaticNotVolatileObject(IdentifierTree variable) { Symbol symbol = variable.symbol(); if (symbol.isUnknown()) { return false; } return isStaticNotFinalNotVolatile(symbol) && !symbol.type().isPrimitive(); }
@CheckForNull private static Type getCallSiteType(MethodInvocationTree mit) { ExpressionTree methodSelect = mit.methodSelect(); // methodSelect can only be Tree.Kind.IDENTIFIER or Tree.Kind.MEMBER_SELECT if (methodSelect.is(Tree.Kind.IDENTIFIER)) { Symbol.TypeSymbol enclosingClassSymbol = ((IdentifierTree) methodSelect).symbol().enclosingClass(); return enclosingClassSymbol != null ? enclosingClassSymbol.type() : null; } else { return ((MemberSelectExpressionTree) methodSelect).expression().symbolType(); } }
private static boolean nonLocalAssignment(Tree syntaxNode) { if (syntaxNode.is(Tree.Kind.ASSIGNMENT)) { ExpressionTree variable = ((AssignmentExpressionTree) syntaxNode).variable(); return !variable.is(Tree.Kind.IDENTIFIER) || ((IdentifierTree) variable).symbol().owner().isTypeSymbol(); } return false; }
private SymbolicValue getTargetValue(MethodInvocationTree syntaxNode) { ExpressionTree targetExpression = ((MemberSelectExpressionTree) syntaxNode.methodSelect()).expression(); SymbolicValue value; if (targetExpression.is(Tree.Kind.IDENTIFIER)) { IdentifierTree identifier = (IdentifierTree) targetExpression; value = programState.getValue(identifier.symbol()); } else { value = programState.peekValue(); } return value; }
private void checkAssignment(AssignmentExpressionTree assignment) { checkCookieBuilder(assignment); if (shouldVerify(assignment)) { categorizeBasedOnConstructor((NewClassTree) assignment.expression(), (VariableSymbol) ((IdentifierTree) assignment.variable()).symbol()); } }
private void executeIdentifier(IdentifierTree tree) { Symbol symbol = tree.symbol(); SymbolicValue value = programState.getValue(symbol); if (value == null) { value = constraintManager.createSymbolicValue(tree); programState = programState.stackValue(value, symbol); learnIdentifierConstraints(tree, value); } else { programState = programState.stackValue(value, symbol); } programState = programState.put(symbol, value); }