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); } } }
private static ProgramState removeNotConsumedConstraints(ProgramState programState) { ProgramState intermediateState = programState; for (SymbolicValue notConsumed : intermediateState.getValuesWithConstraints(StreamPipelineConstraint.NOT_CONSUMED)) { intermediateState = intermediateState.removeConstraintsOnDomain(notConsumed, StreamPipelineConstraint.class); } return intermediateState; }
private static ProgramState removeNotConsumedConstraints(ProgramState programState) { ProgramState intermediateState = programState; for (SymbolicValue notConsumed : intermediateState.getValuesWithConstraints(StreamPipelineConstraint.NOT_CONSUMED)) { intermediateState = intermediateState.removeConstraintsOnDomain(notConsumed, StreamPipelineConstraint.class); } return intermediateState; }
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 addZeroConstraint(SymbolicValue sv, @Nullable ZeroConstraint zeroConstraint) { if(zeroConstraint == null) { programState = programState.removeConstraintsOnDomain(sv, ZeroConstraint.class); } else { programState = programState.addConstraint(sv, zeroConstraint); } } }
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 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 List<ProgramState> addNullConstraintsForBooleanWrapper(ProgramState initialProgramState, List<ProgramState> copiedConstraints) { BooleanConstraint leftConstraint = initialProgramState.getConstraint(leftOp, BooleanConstraint.class); BooleanConstraint rightConstraint = initialProgramState.getConstraint(rightOp, BooleanConstraint.class); if (leftConstraint != null && rightConstraint == null && !isEquality()) { List<ProgramState> nullConstraints = copiedConstraints.stream() .flatMap(ps -> rightOp.setConstraint(ps, ObjectConstraint.NULL).stream()) .map(ps -> ps.removeConstraintsOnDomain(rightOp, BooleanConstraint.class) ).collect(Collectors.toList()); return ImmutableList.<ProgramState>builder().addAll(copiedConstraints).addAll(nullConstraints).build(); } return copiedConstraints; }
private List<ProgramState> addNullConstraintsForBooleanWrapper(ProgramState initialProgramState, List<ProgramState> copiedConstraints) { BooleanConstraint leftConstraint = initialProgramState.getConstraint(leftOp, BooleanConstraint.class); BooleanConstraint rightConstraint = initialProgramState.getConstraint(rightOp, BooleanConstraint.class); if (leftConstraint != null && rightConstraint == null && !isEquality()) { List<ProgramState> nullConstraints = copiedConstraints.stream() .flatMap(ps -> rightOp.setConstraint(ps, ObjectConstraint.NULL).stream()) .map(ps -> ps.removeConstraintsOnDomain(rightOp, BooleanConstraint.class) ).collect(Collectors.toList()); return ImmutableList.<ProgramState>builder().addAll(copiedConstraints).addAll(nullConstraints).build(); } return copiedConstraints; }
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); }
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); }
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 handleMultiply(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(2); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); SymbolicValue op2 = operands.get(1); boolean op1Zero = isZero(currentState, op1); if (op1Zero || isZero(currentState, op2)) { // Reuse zero return currentState.unstackValue(1).state.stackValue(op1Zero ? op1 : op2); } if (isNonZero(currentState, op1) && isNonZero(currentState, op2)) { return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class).addConstraint(result, ZeroConstraint.NON_ZERO); } return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class); }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { ProgramState state = context.getState(); if (isReturningPipeline(syntaxNode) || nonLocalAssignment(syntaxNode)) { return state.removeConstraintsOnDomain(state.peekValue(), StreamPipelineConstraint.class); } return state; }
private static ProgramState handleMultiply(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(2); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); SymbolicValue op2 = operands.get(1); boolean op1Zero = isZero(currentState, op1); if (op1Zero || isZero(currentState, op2)) { // Reuse zero return currentState.unstackValue(1).state.stackValue(op1Zero ? op1 : op2); } if (isNonZero(currentState, op1) && isNonZero(currentState, op2)) { return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class).addConstraint(result, ZeroConstraint.NON_ZERO); } return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class); }
@Override public ProgramState checkPostStatement(CheckerContext context, Tree syntaxNode) { ProgramState state = context.getState(); if (isReturningPipeline(syntaxNode) || nonLocalAssignment(syntaxNode)) { return state.removeConstraintsOnDomain(state.peekValue(), StreamPipelineConstraint.class); } return state; }
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 handlePlusMinus(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(2); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); SymbolicValue op2 = operands.get(1); boolean op1Zero = isZero(currentState, op1); boolean op2Zero = isZero(currentState, op2); if (op2Zero) { return currentState.unstackValue(1).state.stackValue(op1); } else if (op1Zero) { return currentState.unstackValue(1).state.stackValue(op2); } // we know nothing about zero-ness return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class); }
private static ProgramState handlePlusMinus(ProgramState previousState, ProgramState currentState) { List<SymbolicValue> operands = previousState.peekValues(2); SymbolicValue result = currentState.peekValue(); SymbolicValue op1 = operands.get(0); SymbolicValue op2 = operands.get(1); boolean op1Zero = isZero(currentState, op1); boolean op2Zero = isZero(currentState, op2); if (op2Zero) { return currentState.unstackValue(1).state.stackValue(op1); } else if (op1Zero) { return currentState.unstackValue(1).state.stackValue(op2); } // we know nothing about zero-ness return currentState.removeConstraintsOnDomain(result, BooleanConstraint.class); }