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