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);