コード例 #1
0
ファイル: Driver.cs プロジェクト: liyistc/symdiff
        public static int PrintCallGraph(string filename)
        {
            var program = BoogieUtils.ParseProgram(filename);

            if (program == null)
            {
                Console.WriteLine("parse failed");
                return(1);
            }
            if (BoogieUtils.ResolveAndTypeCheckThrow(program, filename))
            {
                if (program == null)
                {
                    Console.WriteLine("check failed");
                    return(1);
                }
            }

            var cg = CallGraph.Make(program);

            Console.WriteLine("digraph G {");
            cg.Print();
            Console.WriteLine("}");

            return(0);
        }
コード例 #2
0
ファイル: Driver.cs プロジェクト: liyistc/symdiff
        public static int RecursionCheck(string filename)
        {
            var program = BoogieUtils.ParseProgram(filename);

            if (program == null)
            {
                return(1);
            }
            BoogieUtils.ResolveAndTypeCheckThrow(program, filename);

            var flag  = false;
            var mflag = false;
            var nflag = false;

            var cg = CallGraph.Make(program);

            var recs = cg.SinglyRecursiveFns();

            foreach (var node in recs)
            {
                Console.WriteLine(node.Name);
            }

            nflag = cg.HasCycle();

            foreach (var scc in cg.ComputeSCCs())
            {
                if ((scc.Count == 1 && scc[0].IsSinglyRecursive()))
                {
                    flag = true;
                }
                if (scc.Count > 1)
                {
                    mflag = true;
                }
            }

            if (flag)
            {
                Console.WriteLine("Recursive.");
            }
            if (mflag)
            {
                Console.WriteLine("Multi_Recursive");
            }
            if (nflag)
            {
                Console.WriteLine("Naive cycle detector found a non-singleton cycle!");
            }
            return(0);
        }