@Override public void visitMethodInvocation(MethodInvocationTree syntaxNode) { if (methodOpeningResource(syntaxNode)) { SymbolicValue peekedValue = programState.peekValue(); programState = programState.addConstraintTransitively(peekedValue, OPEN); // returned resource is not null programState = programState.addConstraint(peekedValue, ObjectConstraint.NOT_NULL); } }
private static ProgramState setDoubleOrLong(ProgramState programState, SymbolicValue sv, boolean value) { if (value) { return programState.addConstraint(sv, LONG_OR_DOUBLE); } else { return programState.removeConstraintsOnDomain(sv, StackValueCategoryConstraint.class); } }
private void addZeroConstraint(SymbolicValue sv, @Nullable ZeroConstraint zeroConstraint) { if(zeroConstraint == null) { programState = programState.removeConstraintsOnDomain(sv, ZeroConstraint.class); } else { programState = programState.addConstraint(sv, zeroConstraint); } } }
@Override public void visitMethodInvocation(MethodInvocationTree syntaxNode) { if (methodOpeningResource(syntaxNode)) { SymbolicValue peekedValue = programState.peekValue(); programState = programState.addConstraintTransitively(peekedValue, OPEN); // returned resource is not null programState = programState.addConstraint(peekedValue, ObjectConstraint.NOT_NULL); } }
public List<ProgramState> setConstraint(ProgramState programState, BooleanConstraint booleanConstraint) { Constraint cstraint = programState.getConstraint(this, booleanConstraint.getClass()); if (!booleanConstraint.isValidWith(cstraint)) { return ImmutableList.of(); } return ImmutableList.of(programState.addConstraint(this, booleanConstraint)); }
@Override public List<ProgramState> setConstraint(ProgramState programState, BooleanConstraint booleanConstraint) { if (BooleanConstraint.TRUE.equals(booleanConstraint)) { return ImmutableList.of(programState.addConstraint(operand, new ObjectConstraint(false, false, syntaxNode, Status.LOCKED))); } else { return ImmutableList.of(programState.addConstraint(operand, new ObjectConstraint(syntaxNode, Status.UNLOCKED))); } }
private void closeResultSetsRelatedTo(SymbolicValue value) { for (Map.Entry<SymbolicValue, ObjectConstraint> constrainedValue : programState.getValuesWithConstraints(Status.OPENED).entrySet()) { if (constrainedValue.getKey() instanceof ResourceWrapperSymbolicValue) { ResourceWrapperSymbolicValue rValue = (ResourceWrapperSymbolicValue) constrainedValue.getKey(); if (value.equals(rValue.dependent)) { programState = programState.addConstraint(rValue, constrainedValue.getValue().withStatus(Status.CLOSED)); } } } }
public List<ProgramState> setConstraint(ProgramState programState, Constraint constraint) { if(constraint instanceof BooleanConstraint) { return setConstraint(programState, (BooleanConstraint) constraint); } else if(constraint instanceof ObjectConstraint) { return setConstraint(programState, (ObjectConstraint) constraint); } Constraint csrtaint = programState.getConstraint(this, constraint.getClass()); if (constraint.isValidWith(csrtaint)) { return ImmutableList.of(programState.addConstraint(this, constraint)); } return ImmutableList.of(); }
public ProgramState addConstraintTransitively(SymbolicValue symbolicValue, Constraint constraint) { List<SymbolicValue> transitiveSymbolicValues = knownRelations().stream() .filter(rsv -> rsv.isEquality() && (rsv.getLeftOp() == symbolicValue || rsv.getRightOp() == symbolicValue)) .map(rsv -> rsv.getLeftOp() == symbolicValue ? rsv.getRightOp() : rsv.getLeftOp()) .collect(Collectors.toList()); ProgramState ps = addConstraint(symbolicValue, constraint); for (SymbolicValue sv : transitiveSymbolicValues) { ps = ps.addConstraint(sv, constraint); } return ps; }
public List<ProgramState> setConstraint(ProgramState programState, Constraint constraint) { if(constraint instanceof BooleanConstraint) { return setConstraint(programState, (BooleanConstraint) constraint); } else if(constraint instanceof ObjectConstraint) { return setConstraint(programState, (ObjectConstraint) constraint); } Constraint csrtaint = programState.getConstraint(this, constraint.getClass()); if (constraint.isValidWith(csrtaint)) { return ImmutableList.of(programState.addConstraint(this, constraint)); } return ImmutableList.of(); }
private static ProgramState handleNumericalLiteral(CheckerContext context, @Nullable Number value) { ProgramState programState = context.getState(); if (value == null) { return programState; } return programState.addConstraint(programState.peekValue(), new NumericalConstraint(value)); }
private static ProgramState handleNumericalLiteral(CheckerContext context, @Nullable Number value) { ProgramState programState = context.getState(); if (value == null) { return programState; } return programState.addConstraint(programState.peekValue(), new NumericalConstraint(value)); }
private void executeBinaryExpression(Tree tree) { // Consume two and produce one SV. ProgramState.Pop unstackBinary = programState.unstackValue(2); programState = unstackBinary.state; SymbolicValue symbolicValue = constraintManager.createBinarySymbolicValue(tree, unstackBinary.valuesAndSymbols); programState = programState.addConstraint(symbolicValue, ObjectConstraint.NOT_NULL); programState = programState.stackValue(symbolicValue); }
private void executeBinaryExpression(Tree tree) { // Consume two and produce one SV. ProgramState.Pop unstackBinary = programState.unstackValue(2); programState = unstackBinary.state; SymbolicValue symbolicValue = constraintManager.createBinarySymbolicValue(tree, unstackBinary.valuesAndSymbols); programState = programState.addConstraint(symbolicValue, ObjectConstraint.NOT_NULL); programState = programState.stackValue(symbolicValue); }
private static ProgramState handleOpenOptionAppend(ProgramState programState, IdentifierTree identifier) { if (identifier.symbolType().is("java.nio.file.StandardOpenOption") && "APPEND".equals(identifier.name())) { return programState.addConstraint(programState.peekValue(), new FileOutputStreamAppendConstraint(identifier)); } return programState; }
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); }
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); }
private ProgramState handleSpecialMethods(ProgramState ps, MethodInvocationTree mit) { if (isAnnotatedNonNull(mit.symbol())) { return ps.addConstraint(ps.peekValue(), ObjectConstraint.NOT_NULL); } else if (OBJECT_WAIT_MATCHER.matches(mit)) { return ps.resetFieldValues(constraintManager, false); } return ps; }
private ProgramState handleSpecialMethods(ProgramState ps, MethodInvocationTree mit) { if (isAnnotatedNonNull(mit.symbol())) { return ps.addConstraint(ps.peekValue(), ObjectConstraint.NOT_NULL); } else if (OBJECT_WAIT_MATCHER.matches(mit)) { return ps.resetFieldValues(constraintManager, false); } return ps; }
@Override public void visitMethodInvocation(MethodInvocationTree syntaxNode) { if (syntaxNode.methodSelect().is(Tree.Kind.MEMBER_SELECT) && needsClosing(syntaxNode.symbolType())) { final ExpressionTree targetExpression = ((MemberSelectExpressionTree) syntaxNode.methodSelect()).expression(); if (targetExpression.is(Tree.Kind.IDENTIFIER) && !isWithinTryHeader(syntaxNode) && (syntaxNode.symbol().isStatic() || isJdbcResourceCreation(targetExpression))) { programState = programState.addConstraint(programState.peekValue(), new ObjectConstraint(false, false, syntaxNode, Status.OPENED)); } } }