Exemplo n.º 1
0
        public static bool BoogieOnce(string baseFile, string moduleName, Bpl.Program boogieProgram, string programId,
                                      out PipelineStatistics stats, out PipelineOutcome oc)
        {
            if (programId == null)
            {
                programId = "main_program_id";
            }
            programId += "_" + moduleName;

            string bplFilename;

            if (CommandLineOptions.Clo.PrintFile != null)
            {
                bplFilename = CommandLineOptions.Clo.PrintFile;
            }
            else
            {
                string baseName = cce.NonNull(Path.GetFileName(baseFile));
                baseName    = cce.NonNull(Path.ChangeExtension(baseName, "bpl"));
                bplFilename = Path.Combine(Path.GetTempPath(), baseName);
            }

            bplFilename = BoogieProgramSuffix(bplFilename, moduleName);
            stats       = null;
            oc          = BoogiePipelineWithRerun(boogieProgram, bplFilename, out stats, 1 < Dafny.DafnyOptions.Clo.VerifySnapshots ? programId : null);
            return((oc == PipelineOutcome.Done || oc == PipelineOutcome.VerificationCompleted) && stats.ErrorCount == 0 && stats.InconclusiveCount == 0 && stats.TimeoutCount == 0 && stats.OutOfMemoryCount == 0);
        }
Exemplo n.º 2
0
        public static bool BoogieOnce(string baseFile, string moduleName, Bpl.Program boogieProgram, string programId,
                                      out PipelineStatistics stats, out PipelineOutcome oc)
        {
            if (programId == null)
            {
                programId = "main_program_id";
            }
            programId += "_" + moduleName;

            string bplFilename;

            if (CommandLineOptions.Clo.PrintFile != null)
            {
                bplFilename = CommandLineOptions.Clo.PrintFile;
            }
            else
            {
                string baseName = cce.NonNull(Path.GetFileName(baseFile));
                baseName    = cce.NonNull(Path.ChangeExtension(baseName, "bpl"));
                bplFilename = Path.Combine(Path.GetTempPath(), baseName);
            }

            bplFilename = BoogieProgramSuffix(bplFilename, moduleName);
            stats       = null;
            oc          = BoogiePipelineWithRerun(boogieProgram, bplFilename, out stats, 1 < Dafny.DafnyOptions.Clo.VerifySnapshots ? programId : null);
            return(IsBoogieVerified(oc, stats));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Resolve, type check, infer invariants for, and verify the given Boogie program.
        /// The intention is that this Boogie program has been produced by translation from something
        /// else.  Hence, any resolution errors and type checking errors are due to errors in
        /// the translation.
        /// The method prints errors for resolution and type checking errors, but still returns
        /// their error code.
        /// </summary>
        static PipelineOutcome BoogiePipelineWithRerun(Bpl.Program /*!*/ program, string /*!*/ bplFileName,
                                                       out PipelineStatistics stats, string programId)
        {
            Contract.Requires(program != null);
            Contract.Requires(bplFileName != null);
            Contract.Ensures(0 <= Contract.ValueAtReturn(out stats).InconclusiveCount&& 0 <= Contract.ValueAtReturn(out stats).TimeoutCount);

            stats = new PipelineStatistics();
            LinearTypeChecker ltc;
            CivlTypeChecker   ctc;
            PipelineOutcome   oc = ExecutionEngine.ResolveAndTypecheck(program, bplFileName, out ltc, out ctc);

            switch (oc)
            {
            case PipelineOutcome.Done:
                return(oc);

            case PipelineOutcome.ResolutionError:
            case PipelineOutcome.TypeCheckingError:
            {
                ExecutionEngine.PrintBplFile(bplFileName, program, false, false, CommandLineOptions.Clo.PrettyPrint);
                Console.WriteLine();
                Console.WriteLine("*** Encountered internal translation error - re-running Boogie to get better debug information");
                Console.WriteLine();

                List <string /*!*/> /*!*/ fileNames = new List <string /*!*/>();
                fileNames.Add(bplFileName);
                Bpl.Program reparsedProgram = ExecutionEngine.ParseBoogieProgram(fileNames, true);
                if (reparsedProgram != null)
                {
                    ExecutionEngine.ResolveAndTypecheck(reparsedProgram, bplFileName, out ltc, out ctc);
                }
            }
                return(oc);

            case PipelineOutcome.ResolvedAndTypeChecked:
                ExecutionEngine.EliminateDeadVariables(program);
                ExecutionEngine.CollectModSets(program);
                ExecutionEngine.CoalesceBlocks(program);
                ExecutionEngine.Inline(program);
                return(ExecutionEngine.InferAndVerify(program, stats, programId));

            default:
                Contract.Assert(false); throw new cce.UnreachableException(); // unexpected outcome
            }
        }