private static boolean hasLiteralInitializer(@Nullable ExpressionTree initializer) { return initializer != null && ExpressionUtils.skipParentheses(initializer).is( Tree.Kind.BOOLEAN_LITERAL, Tree.Kind.CHAR_LITERAL, Tree.Kind.DOUBLE_LITERAL, Tree.Kind.FLOAT_LITERAL, Tree.Kind.INT_LITERAL, Tree.Kind.LONG_LITERAL, Tree.Kind.NULL_LITERAL, Tree.Kind.STRING_LITERAL); } }
/** * Checks of is the given tree is a {@link MemberSelectExpressionTree} which is selecting with <code>this</code> or <code>super</code> * @param tree The tree to check. * @return true when the tree is a select on <code>this</code> or <code>super</code> * @see #isSelectOnThisOrSuper(MemberSelectExpressionTree) */ public static boolean isSelectOnThisOrSuper(AssignmentExpressionTree tree) { ExpressionTree variable = ExpressionUtils.skipParentheses(tree.variable()); return variable.is(Tree.Kind.MEMBER_SELECT) && isSelectOnThisOrSuper((MemberSelectExpressionTree) variable); }
private boolean isTernaryWithNullBranch(@Nullable ExpressionTree expressionTree) { if (expressionTree == null) { return false; } ExpressionTree expr = ExpressionUtils.skipParentheses(expressionTree); if (expr.is(Tree.Kind.CONDITIONAL_EXPRESSION)) { ConditionalExpressionTree cet = (ConditionalExpressionTree) expr; return ExpressionUtils.isNullLiteral(cet.trueExpression()) ^ ExpressionUtils.isNullLiteral(cet.falseExpression()); } return false; }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { SymbolicValue var; SymbolicValue expr; Symbol symbol; if (ExpressionUtils.isSimpleAssignment(tree)) { symbol = ExpressionUtils.extractIdentifier(tree).symbol(); var = programState.getValue(symbol); expr = programState.peekValue(); } else { ProgramState.Pop unstackValue = programState.unstackValue(2); var = unstackValue.values.get(1); expr = unstackValue.values.get(0); symbol = unstackValue.valuesAndSymbols.get(0).symbol(); } checkExpression(tree, var, expr, symbol); }
@Override protected void onMethodInvocationFound(MethodInvocationTree mit) { reportIssue(ExpressionUtils.methodName(mit), "Remove this call to \"deleteOnExit\"."); } }
private void executeAssignment(AssignmentExpressionTree tree) { ProgramState.Pop unstack; SymbolicValue value; if (tree.is(Tree.Kind.ASSIGNMENT)) { unstack = ExpressionUtils.isSimpleAssignment(tree) ? programState.unstackValue(1) : programState.unstackValue(2); value = unstack.values.get(0); } else { unstack = programState.unstackValue(2); value = constraintManager.createSymbolicValue(tree); } programState = unstack.state; Symbol symbol = null; if (tree.variable().is(Tree.Kind.IDENTIFIER) || ExpressionUtils.isSelectOnThisOrSuper(tree)) { symbol = ExpressionUtils.extractIdentifier(tree).symbol(); programState = programState.put(symbol, value); } programState = programState.stackValue(value, symbol); }
@Override public void visitBinaryExpression(BinaryExpressionTree tree) { super.visitBinaryExpression(tree); if (isShifting(tree)) { shifts.add(tree); return; } if (ExpressionUtils.isSecuringByte(tree)) { byteContainments.add(tree); return; } if (isIntegerOrLongExpected(tree.symbolType())) { ExpressionTree leftOperand = ExpressionUtils.skipParentheses(tree.leftOperand()); ExpressionTree rightOperand = ExpressionUtils.skipParentheses(tree.rightOperand()); checkShiftWithoutByteSecuring(leftOperand, rightOperand); checkShiftWithoutByteSecuring(rightOperand, leftOperand); } }
private void executeMemberSelect(MemberSelectExpressionTree mse) { if (!"class".equals(mse.identifier().name())) { ProgramState.Pop unstackMSE = programState.unstackValue(1); programState = unstackMSE.state; } if (ExpressionUtils.isSelectOnThisOrSuper(mse)) { executeIdentifier(mse.identifier()); } else { SymbolicValue mseValue = constraintManager.createSymbolicValue(mse); programState = programState.stackValue(mseValue); } }
private static boolean isCallingOverload(JavaSymbol.MethodJavaSymbol methodSymbol, ExpressionTree lastArg) { MethodTree enclosing = ExpressionUtils.getEnclosingMethod(lastArg); return enclosing != null && haveSameParamButLast(enclosing.symbol(), methodSymbol); }
private void buildAssignment(AssignmentExpressionTree tree) { currentBlock.elements.add(tree); build(tree.expression()); // The variable is not evaluated for simple assignment as it's only used to know where to store the value: JLS8-15.26 if (!ExpressionUtils.isSimpleAssignment(tree)) { build(tree.variable()); } }
private static boolean typeIsByte(ExpressionTree expression) { return expression.symbolType().isSubtypeOf("byte") || ExpressionUtils.isSecuringByte(expression); } }
@Override protected void onMethodInvocationFound(MethodInvocationTree mit) { reportIssue(ExpressionUtils.methodName(mit), "Make sure that encrypting data is safe here."); } }
private boolean isTernaryWithNullBranch(@Nullable ExpressionTree expressionTree) { if (expressionTree == null) { return false; } ExpressionTree expr = ExpressionUtils.skipParentheses(expressionTree); if (expr.is(Tree.Kind.CONDITIONAL_EXPRESSION)) { ConditionalExpressionTree cet = (ConditionalExpressionTree) expr; return ExpressionUtils.isNullLiteral(cet.trueExpression()) ^ ExpressionUtils.isNullLiteral(cet.falseExpression()); } return false; }
private void executeAssignment(AssignmentExpressionTree tree) { ProgramState.Pop unstack; SymbolicValue value; if (tree.is(Tree.Kind.ASSIGNMENT)) { unstack = ExpressionUtils.isSimpleAssignment(tree) ? programState.unstackValue(1) : programState.unstackValue(2); value = unstack.values.get(0); } else { unstack = programState.unstackValue(2); value = constraintManager.createSymbolicValue(tree); } programState = unstack.state; Symbol symbol = null; if (tree.variable().is(Tree.Kind.IDENTIFIER) || ExpressionUtils.isSelectOnThisOrSuper(tree)) { symbol = ExpressionUtils.extractIdentifier(tree).symbol(); programState = programState.put(symbol, value); } programState = programState.stackValue(value, symbol); }
@Override public void visitBinaryExpression(BinaryExpressionTree tree) { super.visitBinaryExpression(tree); if (isShifting(tree)) { shifts.add(tree); return; } if (ExpressionUtils.isSecuringByte(tree)) { byteContainments.add(tree); return; } if (isIntegerOrLongExpected(tree.symbolType())) { ExpressionTree leftOperand = ExpressionUtils.skipParentheses(tree.leftOperand()); ExpressionTree rightOperand = ExpressionUtils.skipParentheses(tree.rightOperand()); checkShiftWithoutByteSecuring(leftOperand, rightOperand); checkShiftWithoutByteSecuring(rightOperand, leftOperand); } }
@CheckForNull private Symbol learnedConstraintOnInitializedFinalField(Tree syntaxTree) { Symbol result = null; if (syntaxTree.is(Tree.Kind.IDENTIFIER)) { result = ((IdentifierTree) syntaxTree).symbol(); } else if (syntaxTree.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree mset = (MemberSelectExpressionTree) syntaxTree; if (ExpressionUtils.isSelectOnThisOrSuper(mset)) { result = mset.identifier().symbol(); } } if (isFinalFieldWithInitializer(result)) { return result; } return null; }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { SymbolicValue var; SymbolicValue expr; Symbol symbol; if (ExpressionUtils.isSimpleAssignment(tree)) { symbol = ExpressionUtils.extractIdentifier(tree).symbol(); var = programState.getValue(symbol); expr = programState.peekValue(); } else { ProgramState.Pop unstackValue = programState.unstackValue(2); var = unstackValue.values.get(1); expr = unstackValue.values.get(0); symbol = unstackValue.valuesAndSymbols.get(0).symbol(); } checkExpression(tree, var, expr, symbol); }
private static boolean isCallingOverload(JavaSymbol.MethodJavaSymbol methodSymbol, ExpressionTree lastArg) { MethodTree enclosing = ExpressionUtils.getEnclosingMethod(lastArg); return enclosing != null && haveSameParamButLast(enclosing.symbol(), methodSymbol); }
private void buildAssignment(AssignmentExpressionTree tree) { currentBlock.elements.add(tree); build(tree.expression()); // The variable is not evaluated for simple assignment as it's only used to know where to store the value: JLS8-15.26 if (!ExpressionUtils.isSimpleAssignment(tree)) { build(tree.variable()); } }