Source:
<code><START> private void handleConditionSuccessors(CfgBranchingBlock block, ProgramState currentState) { <END> Symbol trackedVariable; Truthiness trueSuccessorTruthiness; Truthiness falseSuccessorTruthiness; Tree lastElement = block.elements().get(block.elements().size() - 1); boolean isUnaryNot = lastElement.is(Kind.LOGICAL_COMPLEMENT); if (isUnaryNot) { UnaryExpressionTree unary = (UnaryExpressionTree) lastElement; trackedVariable = trackedVariable(unary.expression()); trueSuccessorTruthiness = Truthiness.FALSY; falseSuccessorTruthiness = Truthiness.TRUTHY; } else { trackedVariable = trackedVariable(lastElement); trueSuccessorTruthiness = Truthiness.TRUTHY; falseSuccessorTruthiness = Truthiness.FALSY; } if (trackedVariable != null) { SymbolicValue currentValue = currentState.get(trackedVariable); Truthiness currentTruthiness = currentValue == null ? Truthiness.FALSY : currentValue.truthiness(); Truthiness conditionTruthiness = isUnaryNot ? currentTruthiness.not() : currentTruthiness; conditionResults.put(lastElement, conditionTruthiness); if (currentTruthiness != falseSuccessorTruthiness) { pushSuccessor(currentState.constrain(trackedVariable, trueSuccessorTruthiness), block.trueSuccessor()); } if (currentTruthiness != trueSuccessorTruthiness) { pushSuccessor(currentState.constrain(trackedVariable, falseSuccessorTruthiness), block.falseSuccessor()); } } else { pushAllSuccessors(block, currentState); } }</code><technical_language>@pynicolas for branching block push successors twice</technical_language>

Target:
private void handleConditionSuccessors(CfgBranchingBlock block, ProgramState currentState) { Tree lastElement = block.elements().get(block.elements().size() - 1); if (lastElement.is(Kind.BOOLEAN_LITERAL)) { SymbolicValue conditionValue = SymbolicValue.get((LiteralTree) lastElement); Truthiness conditionTruthiness = conditionValue.truthiness(); if (!block.branchingTree().is(Kind.FOR_STATEMENT, Kind.WHILE_STATEMENT, Kind.DO_WHILE_STATEMENT)) { conditionResults.put(lastElement, conditionTruthiness); } CfgBlock successor = conditionTruthiness == Truthiness.TRUTHY ? block.trueSuccessor() : block.falseSuccessor(); pushSuccessor(successor, currentState); return; } Symbol conditionVariable; Truthiness trueSuccessorTruthiness; Truthiness falseSuccessorTruthiness; boolean isUnaryNot = lastElement.is(Kind.LOGICAL_COMPLEMENT); if (isUnaryNot) { UnaryExpressionTree unary = (UnaryExpressionTree) lastElement; conditionVariable = trackedVariable(unary.expression()); trueSuccessorTruthiness = Truthiness.FALSY; falseSuccessorTruthiness = Truthiness.TRUTHY; } else { conditionVariable = trackedVariable(lastElement); trueSuccessorTruthiness = Truthiness.TRUTHY; falseSuccessorTruthiness = Truthiness.FALSY; } if (conditionVariable != null) { SymbolicValue currentValue = currentState.get(conditionVariable); Truthiness currentTruthiness = currentValue.truthiness(); Truthiness conditionTruthiness = isUnaryNot ? currentTruthiness.not() : currentTruthiness; conditionResults.put(lastElement, conditionTruthiness); if (currentTruthiness != falseSuccessorTruthiness) { pushSuccessor(block.trueSuccessor(), currentState.constrain(conditionVariable, trueSuccessorTruthiness)); } if (currentTruthiness != trueSuccessorTruthiness) { pushSuccessor(block.falseSuccessor(), currentState.constrain(conditionVariable, falseSuccessorTruthiness)); } } else { pushAllSuccessors(block, currentState); } }