@Override protected List<ProgramState> copyConstraint(SymbolicValue from, SymbolicValue to, ProgramState programState, BooleanConstraint booleanConstraint) { ProgramState newState = programState; if (programState.canReach(from) || programState.canReach(to)) { newState = programState.addConstraint(this, booleanConstraint); } return super.copyConstraint(from, to, newState, booleanConstraint); }
public List<ProgramState> setConstraint(ProgramState programState, BooleanConstraint booleanConstraint) { Object data = programState.getConstraint(this); // update program state only for a different constraint if (data instanceof BooleanConstraint) { BooleanConstraint bc = (BooleanConstraint) data; if (!bc.equals(booleanConstraint)) { // setting null where value is known to be non null or the contrary return ImmutableList.of(); } } if ((data == null || !data.equals(booleanConstraint)) && programState.canReach(this)) { // store constraint only if symbolic value can be reached by a symbol. return ImmutableList.of(programState.addConstraint(this, booleanConstraint)); } return ImmutableList.of(programState); }
private List<ProgramState> copyAllConstraints(ProgramState initialState, Set<RelationalSymbolicValue> knownRelations) { ProgramState programState = initialState; if (programState.canReach(leftOp) || programState.canReach(rightOp)) { programState = programState.addConstraint(this, BooleanConstraint.TRUE); } List<ProgramState> results = new ArrayList<>(); List<ProgramState> copiedConstraints = copyConstraintFromTo(leftOp, rightOp, programState, knownRelations); if (Kind.METHOD_EQUALS == kind || Kind.NOT_METHOD_EQUALS == kind) { copiedConstraints = addNullConstraintsForBooleanWrapper(programState, copiedConstraints); } for (ProgramState ps : copiedConstraints) { List<ProgramState> copiedConstraintsRightToLeft = copyConstraintFromTo(rightOp, leftOp, ps, knownRelations); if (copiedConstraintsRightToLeft.size() == 1 && copiedConstraintsRightToLeft.get(0).equals(programState)) { results.add(programState.addConstraint(this, BooleanConstraint.TRUE)); } else { results.addAll(copiedConstraintsRightToLeft); } } return results; }
private List<ProgramState> copyAllConstraints(ProgramState initialState, Set<RelationalSymbolicValue> knownRelations) { ProgramState programState = initialState; if (programState.canReach(leftOp) || programState.canReach(rightOp)) { programState = programState.addConstraint(this, BooleanConstraint.TRUE); } List<ProgramState> results = new ArrayList<>(); List<ProgramState> copiedConstraints = copyConstraintFromTo(leftOp, rightOp, programState, knownRelations); if (Kind.METHOD_EQUALS == kind || Kind.NOT_METHOD_EQUALS == kind) { copiedConstraints = addNullConstraintsForBooleanWrapper(programState, copiedConstraints); } for (ProgramState ps : copiedConstraints) { List<ProgramState> copiedConstraintsRightToLeft = copyConstraintFromTo(rightOp, leftOp, ps, knownRelations); if (copiedConstraintsRightToLeft.size() == 1 && copiedConstraintsRightToLeft.get(0).equals(programState)) { results.add(programState.addConstraint(this, BooleanConstraint.TRUE)); } else { results.addAll(copiedConstraintsRightToLeft); } } return results; }