protected virtual void VisitSimpleBlock(SimpleBlock block, ExplodedGraphNode node)
        {
            var newProgramState = CleanStateAfterBlock(node.ProgramState, block);

            var jumpBlock = block as JumpBlock;

            if (jumpBlock != null &&
                IsValueConsumingStatement(jumpBlock.JumpNode))
            {
                newProgramState = newProgramState.PopValue();
            }

            EnqueueAllSuccessors(block, newProgramState);
        }
 protected abstract void VisitInstruction(ExplodedGraphNode node);
        protected virtual void VisitSingleSuccessorBinaryBranch(BinaryBranchingSimpleBlock block, ExplodedGraphNode node)
        {
            SymbolicValue sv;
            var           programState = node.ProgramState.PopValue(out sv);

            foreach (var newProgramState in sv.TrySetConstraint(BoolConstraint.True, programState))
            {
                OnConditionEvaluated(block.BranchingInstruction, evaluationValue: true);
                var nps = newProgramState.PushValue(SymbolicValue.True);
                EnqueueNewNode(new ProgramPoint(block.SuccessorBlock), nps);
            }

            foreach (var newProgramState in sv.TrySetConstraint(BoolConstraint.False, programState))
            {
                OnConditionEvaluated(block.BranchingInstruction, evaluationValue: false);
                var nps = newProgramState.PushValue(SymbolicValue.False);
                EnqueueNewNode(new ProgramPoint(block.SuccessorBlock), nps);
            }
        }
 protected abstract void VisitBinaryBranch(BinaryBranchBlock binaryBranchBlock, ExplodedGraphNode node);