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