@Override public void computedFrom(List<ProgramState.SymbolicValueSymbol> symbolicValues) { Preconditions.checkArgument(symbolicValues.size() == 1); this.operand = symbolicValues.get(0).symbolicValue(); this.operandSymbol = symbolicValues.get(0).symbol(); }
@Override public void computedFrom(List<ProgramState.SymbolicValueSymbol> symbolicValues) { Preconditions.checkArgument(symbolicValues.size() == 2); Preconditions.checkState(leftOp == null && rightOp == null, "Operands already set!"); rightOp = symbolicValues.get(0).symbolicValue(); rightSymbol = symbolicValues.get(0).symbol(); leftOp = symbolicValues.get(1).symbolicValue(); leftSymbol = symbolicValues.get(1).symbol(); }
@Override public void computedFrom(List<ProgramState.SymbolicValueSymbol> symbolicValues) { Preconditions.checkArgument(symbolicValues.size() == 1); this.operand = symbolicValues.get(0).symbolicValue(); this.operandSymbol = symbolicValues.get(0).symbol(); }
@Override public void visitNewClass(NewClassTree syntaxNode) { if (isOpeningResource(syntaxNode)) { List<ProgramState.SymbolicValueSymbol> arguments = Lists.reverse(programState.peekValuesAndSymbols(syntaxNode.arguments().size())); Iterator<ProgramState.SymbolicValueSymbol> iterator = arguments.iterator(); for (ExpressionTree argumentTree : syntaxNode.arguments()) { if (!iterator.hasNext()) { throw new IllegalStateException("Mismatch between declared constructor arguments and argument values!"); } ProgramState.SymbolicValueSymbol argument = iterator.next(); if (shouldWrapArgument(argument, argumentTree)) { constraintManager.setValueFactory(new WrappedValueFactory(argument.symbolicValue())); break; } if (shouldCloseArgument(argument)){ closeResource(argument.symbolicValue()); } } } else { closeArguments(syntaxNode.arguments()); } }
@Override public void visitNewClass(NewClassTree syntaxNode) { if (isOpeningResource(syntaxNode)) { List<ProgramState.SymbolicValueSymbol> arguments = Lists.reverse(programState.peekValuesAndSymbols(syntaxNode.arguments().size())); Iterator<ProgramState.SymbolicValueSymbol> iterator = arguments.iterator(); for (ExpressionTree argumentTree : syntaxNode.arguments()) { if (!iterator.hasNext()) { throw new IllegalStateException("Mismatch between declared constructor arguments and argument values!"); } ProgramState.SymbolicValueSymbol argument = iterator.next(); if (shouldWrapArgument(argument, argumentTree)) { constraintManager.setValueFactory(new WrappedValueFactory(argument.symbolicValue())); break; } if (shouldCloseArgument(argument)){ closeResource(argument.symbolicValue()); } } } else { closeArguments(syntaxNode.arguments()); } }
private static Set<Flow> flowsForMethodArguments(ExplodedGraph.Node node, MethodInvocationTree mit, int parameterCausingExceptionIndex) { ProgramState programState = node.programState; List<ProgramState.SymbolicValueSymbol> arguments = Lists.reverse(programState.peekValuesAndSymbols(mit.arguments().size())); SymbolicValue parameterCausingExceptionSV = arguments.get(parameterCausingExceptionIndex).symbolicValue(); Set<SymbolicValue> argSymbolicValues = new LinkedHashSet<>(); Set<Symbol> argSymbols = new LinkedHashSet<>(); arguments.stream() .filter(svs -> parameterCausingExceptionSV == svs.symbolicValue() || hasConstraintOtherThanNonNull(svs, programState)) .forEach(svs -> { argSymbolicValues.add(svs.symbolicValue()); Symbol symbol = svs.symbol(); if (symbol != null) { argSymbols.add(symbol); } }); List<Class<? extends Constraint>> domains = domainsFromArguments(programState, argSymbolicValues); return FlowComputation.flow(node, argSymbolicValues, c -> true, c -> false, domains, argSymbols); }
private void handleAssignment(CheckerContext context, AssignmentExpressionTree assignmentExpressionTree) { SymbolicValueSymbol assignedVariable = context.getState().peekValueSymbol(); Symbol assignedSymbol = assignedVariable.symbol(); if (assignedSymbol == null // Rule S3959 returns the same SV after each intermediate operations, // meaning that 'stream = stream.map(...);' would be detected as redundant assignment if not explicitly excluded || STREAM_TYPES.stream().anyMatch(assignedSymbol.type()::is)) { return; } ExplodedGraph.Node node = context.getNode(); ProgramState previousState = node.programState; SymbolicValue oldValue = previousState.getValue(assignedSymbol); SymbolicValue newValue = assignedVariable.symbolicValue(); Symbol fromSymbol = previousState.peekValueSymbol().symbol(); assignmentsByMethod.peek().put(assignmentExpressionTree, new AssignmentDataHolder(assignedSymbol, oldValue, newValue, fromSymbol, node)); }
private static Set<Flow> flowsForMethodArguments(ExplodedGraph.Node node, MethodInvocationTree mit, int parameterCausingExceptionIndex) { ProgramState programState = node.programState; List<ProgramState.SymbolicValueSymbol> arguments = Lists.reverse(programState.peekValuesAndSymbols(mit.arguments().size())); SymbolicValue parameterCausingExceptionSV = arguments.get(parameterCausingExceptionIndex).symbolicValue(); Set<SymbolicValue> argSymbolicValues = new LinkedHashSet<>(); Set<Symbol> argSymbols = new LinkedHashSet<>(); arguments.stream() .filter(svs -> parameterCausingExceptionSV == svs.symbolicValue() || hasConstraintOtherThanNonNull(svs, programState)) .forEach(svs -> { argSymbolicValues.add(svs.symbolicValue()); Symbol symbol = svs.symbol(); if (symbol != null) { argSymbols.add(symbol); } }); List<Class<? extends Constraint>> domains = domainsFromArguments(programState, argSymbolicValues); return FlowComputation.flow(node, argSymbolicValues, c -> true, c -> false, domains, argSymbols); }
private void handleAssignment(CheckerContext context, AssignmentExpressionTree assignmentExpressionTree) { SymbolicValueSymbol assignedVariable = context.getState().peekValueSymbol(); Symbol assignedSymbol = assignedVariable.symbol(); if (assignedSymbol == null // Rule S3959 returns the same SV after each intermediate operations, // meaning that 'stream = stream.map(...);' would be detected as redundant assignment if not explicitly excluded || STREAM_TYPES.stream().anyMatch(assignedSymbol.type()::is)) { return; } ExplodedGraph.Node node = context.getNode(); ProgramState previousState = node.programState; SymbolicValue oldValue = previousState.getValue(assignedSymbol); SymbolicValue newValue = assignedVariable.symbolicValue(); Symbol fromSymbol = previousState.peekValueSymbol().symbol(); assignmentsByMethod.peek().put(assignmentExpressionTree, new AssignmentDataHolder(assignedSymbol, oldValue, newValue, fromSymbol, node)); }
private boolean shouldCloseArgument(ProgramState.SymbolicValueSymbol argument) { ResourceConstraint argConstraint = programState.getConstraint(argument.symbolicValue(), ResourceConstraint.class); return argConstraint == OPEN; }
private boolean shouldCloseArgument(ProgramState.SymbolicValueSymbol argument) { ResourceConstraint argConstraint = programState.getConstraint(argument.symbolicValue(), ResourceConstraint.class); return argConstraint == OPEN; }
private static boolean hasConstraintOtherThanNonNull(ProgramState.SymbolicValueSymbol svs, ProgramState ps) { SymbolicValue sv = svs.symbolicValue(); ConstraintsByDomain constraints = ps.getConstraints(sv); return constraints != null && !hasOnlyNonNullConstraint(constraints); }
private boolean shouldWrapArgument(ProgramState.SymbolicValueSymbol argument, ExpressionTree argumentTree) { ResourceConstraint argConstraint = programState.getConstraint(argument.symbolicValue(), ResourceConstraint.class); return (argConstraint == OPEN && argument.symbol() != null) || (argConstraint == null && isCloseable(argumentTree)); }
@Override public void computedFrom(List<ProgramState.SymbolicValueSymbol> symbolicValues) { Preconditions.checkArgument(symbolicValues.size() == 2); Preconditions.checkState(leftOp == null && rightOp == null, "Operands already set!"); rightOp = symbolicValues.get(0).symbolicValue(); rightSymbol = symbolicValues.get(0).symbol(); leftOp = symbolicValues.get(1).symbolicValue(); leftSymbol = symbolicValues.get(1).symbol(); }
private static boolean hasConstraintOtherThanNonNull(ProgramState.SymbolicValueSymbol svs, ProgramState ps) { SymbolicValue sv = svs.symbolicValue(); ConstraintsByDomain constraints = ps.getConstraints(sv); return constraints != null && !hasOnlyNonNullConstraint(constraints); }
private boolean shouldWrapArgument(ProgramState.SymbolicValueSymbol argument, ExpressionTree argumentTree) { ResourceConstraint argConstraint = programState.getConstraint(argument.symbolicValue(), ResourceConstraint.class); return (argConstraint == OPEN && argument.symbol() != null) || (argConstraint == null && isCloseable(argumentTree)); }