private static List<SymbolicValue> getArgumentSVs(ProgramState state, Tree syntaxNode, int nbArguments) { if (syntaxNode.is(Tree.Kind.METHOD_INVOCATION)) { return Lists.reverse(state.peekValues(nbArguments + 1).subList(0, nbArguments)); } return Lists.reverse(state.peekValues(nbArguments)); }
private static List<SymbolicValue> getArgumentSVs(ProgramState state, Tree syntaxNode, int nbArguments) { if (syntaxNode.is(Tree.Kind.METHOD_INVOCATION)) { return Lists.reverse(state.peekValues(nbArguments + 1).subList(0, nbArguments)); } return Lists.reverse(state.peekValues(nbArguments)); }
private static ProgramState removeConstraintOnArgs(ProgramState programState, int argumentCount) { ProgramState state = programState; for (SymbolicValue arg : programState.peekValues(argumentCount)) { state = state.removeConstraintsOnDomain(arg, StreamPipelineConstraint.class); } return state; }
private static ProgramState removeConstraintOnArgs(ProgramState programState, int argumentCount) { ProgramState state = programState; for (SymbolicValue arg : programState.peekValues(argumentCount)) { state = state.removeConstraintsOnDomain(arg, StreamPipelineConstraint.class); } return state; }
private void closeArguments(final Arguments arguments, int stackOffset) { final List<SymbolicValue> values = programState.peekValues(arguments.size() + stackOffset); final List<SymbolicValue> argumentValues = values.subList(stackOffset, values.size()); for (SymbolicValue target : argumentValues) { programState = closeResource(programState, target); } }
@Override public void visitNewClass(NewClassTree syntaxNode) { programState.peekValues(syntaxNode.arguments().size()).forEach(this::closeResource); }
@Override public void visitNewClass(NewClassTree syntaxNode) { programState.peekValues(syntaxNode.arguments().size()).forEach(this::closeResource); }
private List<SymbolicValue> argumentsUsedForMethodInvocation(ExplodedGraph.Node invocationNode, MethodInvocationTree mit) { List<SymbolicValue> values = invocationNode.programState.peekValues(mit.arguments().size()); return Lists.reverse(values); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree syntaxNode) { final ExpressionTree variable = syntaxNode.variable(); if (variable.is(Tree.Kind.ARRAY_ACCESS_EXPRESSION)) { List<SymbolicValue> stackedValues = programState.peekValues(2); SymbolicValue value = stackedValues.get(1); programState = closeResource(programState, value); } }
private ProgramState handleMinMaxInvocation(CheckerContext context, MethodInvocationTree syntaxNode) { if (!MIN_MAX_MATCHER.matches(syntaxNode)) { return context.getState(); } ProgramState programState = context.getState(); ProgramState psBeforeInvocation = context.getNode().programState; List<SymbolicValue> args = psBeforeInvocation.peekValues(2); List<ConstraintsByDomain> constraintsByArgs = args.stream().map(programState::getConstraints).collect(Collectors.toList()); checkRangeInconsistencies(context, syntaxNode, constraintsByArgs); return context.getState(); }
private ProgramState handleMinMaxInvocation(CheckerContext context, MethodInvocationTree syntaxNode) { if (!MIN_MAX_MATCHER.matches(syntaxNode)) { return context.getState(); } ProgramState programState = context.getState(); ProgramState psBeforeInvocation = context.getNode().programState; List<SymbolicValue> args = psBeforeInvocation.peekValues(2); List<ConstraintsByDomain> constraintsByArgs = args.stream().map(programState::getConstraints).collect(Collectors.toList()); checkRangeInconsistencies(context, syntaxNode, constraintsByArgs); return context.getState(); }
@Override public void visitNewClass(NewClassTree syntaxTree) { Symbol symbol = syntaxTree.constructorSymbol(); if (symbol.isMethodSymbol()) { int peekSize = syntaxTree.arguments().size(); List<SymbolicValue> argumentValues = Lists.reverse(programState.peekValues(peekSize)); checkNullArguments(syntaxTree, (JavaSymbol.MethodJavaSymbol) symbol, argumentValues); } }
@Override public void visitNewClass(NewClassTree syntaxTree) { Symbol symbol = syntaxTree.constructorSymbol(); if (symbol.isMethodSymbol()) { int peekSize = syntaxTree.arguments().size(); List<SymbolicValue> argumentValues = Lists.reverse(programState.peekValues(peekSize)); checkNullArguments(syntaxTree, (JavaSymbol.MethodJavaSymbol) symbol, argumentValues); } }
@Override public void visitAssignmentExpression(AssignmentExpressionTree syntaxNode) { final ExpressionTree variable = syntaxNode.variable(); if (isNonLocalStorage(variable)) { SymbolicValue value; if (ExpressionUtils.isSimpleAssignment(syntaxNode)) { value = programState.peekValue(); } else { value = programState.peekValues(2).get(0); } closeResource(value); } }
private static ProgramState handleShift(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(2); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); SymbolicValue op2 = operands.get(0); if (isZero(currentState, op1) || isZero(currentState, op2)) { // shifting by zero or shifting zero: Reuse fist operand return currentState.unstackValue(1).state.stackValue(op1); } return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class).addConstraint(result, ZeroConstraint.NON_ZERO); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree syntaxNode) { final ExpressionTree variable = syntaxNode.variable(); if (isNonLocalStorage(variable)) { SymbolicValue value; if (ExpressionUtils.isSimpleAssignment(syntaxNode)) { value = programState.peekValue(); } else { value = programState.peekValues(2).get(0); } closeResource(value); } }
private static ProgramState handleShift(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(2); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); SymbolicValue op2 = operands.get(0); if (isZero(currentState, op1) || isZero(currentState, op2)) { // shifting by zero or shifting zero: Reuse fist operand return currentState.unstackValue(1).state.stackValue(op1); } return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class).addConstraint(result, ZeroConstraint.NON_ZERO); }
@Override public void visitMethodInvocation(MethodInvocationTree mit) { if (isOpeningResource(mit)) { openResource(getTargetSV(mit)); } else if (isClosingResource(mit)) { closeResource(getTargetSV(mit)); } else { programState.peekValues(mit.arguments().size()).forEach(this::closeResource); } }
@Override public void visitMethodInvocation(MethodInvocationTree mit) { if (isOpeningResource(mit)) { openResource(getTargetSV(mit)); } else if (isClosingResource(mit)) { closeResource(getTargetSV(mit)); } else { programState.peekValues(mit.arguments().size()).forEach(this::closeResource); } }
private static ProgramState handleNegation(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(1); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); if (isZero(currentState, op1)) { // Reuse zero return currentState.unstackValue(1).state.stackValue(op1); } if (isNonZero(currentState, op1)) { return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class).addConstraint(result, ZeroConstraint.NON_ZERO); } return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class); }