Ejemplo n.º 1
0
        public static void addPredicatesToBoogieFile(Program inprog, string outfile, string candidateFile)
        {
            // delete {:template} and {:trainingPredicates} procedure
            DeleteNonFreeTemplates(inprog);
            BoogieUtil.PrintProgram(inprog, outfile);

            #region ZL: read summaries from dababase.
            //var database = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location),
            //    "candidates.db");
            var database = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location),
                                        candidateFile);
            if (!System.IO.File.Exists(database))
            {
                throw new Exception("File does not exist: " + database);
            }

            StubAnnotatedSummaryDictionary summaries = null;

            while (true)
            {
                try
                {
                    using (var fs = new System.IO.FileStream(database, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
                    {
                        var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                        summaries = StubAnnotatedSummaryDictionary.GetDictionary(serializer.Deserialize(fs));
                        break;
                    }
                }
                catch (System.IO.IOException ex)
                {
                    Thread.Sleep(300);
                    Console.WriteLine("-- {0}: {1}", ex.GetType().Name, ex.ToString());
                }
            }

            summaries.DeMarshall(z3exe);
            var    numPreds = 0;
            string s        = summaries.DumpPredicates(out numPreds);
            // TODO: 1. Add "free requires yogi_error == 0; free ensures alloc >= old(alloc);"
            //       2. Add the two long candidates for irql rules.
            //       3. Track Mem_T.int4.
            //       4. Add free ensures and free requires for type state variables.
            //       5. Add inline depth argument


            #endregion

            using (var file = new System.IO.StreamWriter(outfile, true))
            {
                file.WriteLine("procedure {:template} summaryTemplates();");
                file.WriteLine(s);
                if (debugging)
                {
                    Console.WriteLine("Written summary tempaltes from cubes.db");
                }
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Usage: generator file.[c|bpl]");
                return;
            }

            for (int i = 0; i < args.Count(); i++)
            {
                ProcessArg(args[i]);
            }

            var files = CommonLib.Util.GetFilesForUnion(args);

            if (files != null)
            {
                if (mode == MODE.GENERATE_ATOMS)
                {
                    // merge atoms.db
                    var dbs = new List <AtomDictionary>();
                    files.Iter(f => dbs.Add(TrainerDB.Driver.ReadAtomDB(f)));
                    TrainerDB.Driver.WriteDB(
                        AtomDictionary.Merge(dbs), CommonLib.GlobalConfig.util_result_file);
                }
                else if (mode == MODE.GENERATE_CANDIDATES)
                {
                    // merge candidates db
                    var dbs = new List <StubAnnotatedSummaryDictionary>();
                    files.Iter(f => dbs.Add(TrainerDB.Driver.ReadCandidateDB(f)));
                    TrainerDB.Driver.WriteDB(
                        StubAnnotatedSummaryDictionary.Merge(dbs), CommonLib.GlobalConfig.util_result_file);
                }
                else
                {
                    // merge corral output
                    var cat = new List <string>();
                    foreach (var file in files)
                    {
                        cat.AddRange(System.IO.File.ReadAllLines(file));
                        cat.Add("=========");
                    }
                    System.IO.File.WriteAllLines(CommonLib.GlobalConfig.util_result_file, cat);
                }

                return;
            }

            try
            {
                // Set up Boogie
                CommandLineOptions.Install(new CommandLineOptions());
                CommandLineOptions.Clo.PrintInstrumented = true;

                // Set up corral, duality
                var root = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
                wlimitexe = Path.Combine(root, "wlimit.exe");
                corralexe = Path.Combine(root, "..", "corral", "corral.exe");
                z3exe     = Path.Combine(root, "..", "corral", "z3.exe");
                iz3exe    = Path.Combine(root, "..", "iz3", "z3.exe");

                runGenerator();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
Ejemplo n.º 3
0
        private static void addSummaryPredicate()
        {
            if (!System.IO.File.Exists("corralPredicates.txt"))
            {
                return;
            }

            // stubs is always [] in the current version.
            var predWithStubs = new HashSet <Tuple <string, string> >();

            using (var file = new System.IO.StreamReader("corralPredicates.txt"))
            {
                string pred;
                string stubs = "";
                while ((pred = file.ReadLine()) != null)
                {
                    if (useStubs)
                    {
                        stubs = file.ReadLine();
                        if (stubs == "[]")
                        {
                            stubs = "";
                        }
                        else
                        {
                            stubs = string.Format("{{:stubs \"{0}\"}}", stubs);
                        }
                    }
                    predWithStubs.Add(Tuple.Create(stubs, pred));
                }
            }

            string database = CommonLib.GlobalConfig.util_result_file;

            Debug.Assert(!System.IO.File.Exists(database));
            var summaries = new StubAnnotatedSummaryDictionary();

            StubAnnotatedSummaryDictionary.CreateProver(z3exe);
            if (useStubs)
            {
                predWithStubs.Iter(tup => summaries.Add(tup.Item1, tup.Item2));
            }
            else
            {
                predWithStubs.Iter(tup => summaries.Add("", tup.Item2));
            }
            //predicates.Iter(pred => summaries.Add(property, pred));
            //summaries.Print(databaseTxt);
            StubAnnotatedSummaryDictionary.CloseProver();
            summaries.Marshall();

            while (true)
            {
                try
                {
                    using (var fs = new System.IO.FileStream(database, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None))
                    {
                        var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                        serializer.Serialize(fs, summaries);
                        break;
                    }
                }
                catch (System.IO.IOException)
                {
                    Random rnd = new Random();
                    Thread.Sleep(rnd.Next(300, 501));
                }
            }
            if (debugging)
            {
                Console.WriteLine("Dumped summaries to db.");
            }
        }