コード例 #1
0
        public static ReachabilityAnalysis Create(IList <ControlFlowNode> controlFlowGraph, RecursiveDetectorVisitor recursiveDetectorVisitor = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (controlFlowGraph == null)
            {
                throw new ArgumentNullException("controlFlowGraph");
            }
            ReachabilityAnalysis ra = new ReachabilityAnalysis();

            ra.recursiveDetectorVisitor = recursiveDetectorVisitor;
            // Analysing a null node can result in an empty control flow graph
            if (controlFlowGraph.Count > 0)
            {
                ra.stack.Push(controlFlowGraph[0]);
                while (ra.stack.Count > 0)
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    ra.MarkReachable(ra.stack.Pop());
                }
            }
            ra.stack        = null;
            ra.visitedNodes = null;
            return(ra);
        }
コード例 #2
0
        public static ReachabilityAnalysis Create(StatementSyntax statement, SemanticModel resolver = null, RecursiveDetectorVisitor recursiveDetectorVisitor = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            var cfgBuilder = new ControlFlowGraphBuilder();
            var cfg        = cfgBuilder.BuildControlFlowGraph(statement, resolver, cancellationToken);

            return(Create(cfg, recursiveDetectorVisitor, cancellationToken));
        }