public void Run() { if (WhoopRaceCheckerCommandLineOptions.Get().MeasurePassExecutionTime) { Console.WriteLine(" |------ [{0} :: {1}]", this.EP1.Name, this.EP2.Name); Console.WriteLine(" | |"); this.Timer = new ExecutionTimer(); this.Timer.Start(); } this.AC.EliminateDeadVariables(); this.AC.Inline(); if (WhoopRaceCheckerCommandLineOptions.Get().LoopUnrollCount != -1) { this.AC.Program.UnrollLoops(WhoopRaceCheckerCommandLineOptions.Get().LoopUnrollCount, WhoopRaceCheckerCommandLineOptions.Get().SoundLoopUnrolling); } string checkerName = "check$" + this.EP1.Name + "$" + this.EP2.Name; Implementation checker = this.AC.TopLevelDeclarations.OfType <Implementation>().ToList(). Find(val => val.Name.Equals(checkerName)); Contract.Assert(checker != null); VC.ConditionGeneration vcgen = null; try { vcgen = new VC.VCGen(this.AC.Program, WhoopRaceCheckerCommandLineOptions.Get().SimplifyLogFilePath, WhoopRaceCheckerCommandLineOptions.Get().SimplifyLogFileAppend, new List <Checker>()); } catch (ProverException e) { Whoop.IO.Reporter.ErrorWriteLine("Fatal Error: ProverException: {0}", e); Environment.Exit((int)Outcome.FatalError); } int prevAssertionCount = vcgen.CumulativeAssertionCount; List <Counterexample> errors; DateTime start = new DateTime(); if (WhoopRaceCheckerCommandLineOptions.Get().Trace) { start = DateTime.UtcNow; if (WhoopRaceCheckerCommandLineOptions.Get().Trace) { Console.WriteLine(""); Console.WriteLine("Verifying {0} ...", checker.Name.Substring(5)); } } VC.VCGen.Outcome vcOutcome; try { vcOutcome = vcgen.VerifyImplementation(checker, out errors); } catch (VC.VCGenException e) { Whoop.IO.Reporter.ReportBplError(checker, String.Format("Error BP5010: {0} Encountered in implementation {1}.", e.Message, checker.Name), true, true); errors = null; vcOutcome = VC.VCGen.Outcome.Inconclusive; } catch (UnexpectedProverOutputException e) { Whoop.IO.Reporter.AdvisoryWriteLine("Advisory: {0} SKIPPED because of internal error: unexpected prover output: {1}", checker.Name, e.Message); errors = null; vcOutcome = VC.VCGen.Outcome.Inconclusive; } string timeIndication = ""; DateTime end = DateTime.UtcNow; TimeSpan elapsed = end - start; if (WhoopRaceCheckerCommandLineOptions.Get().Trace) { int poCount = vcgen.CumulativeAssertionCount - prevAssertionCount; timeIndication = string.Format(" [{0:F3} s, {1} proof obligation{2}] ", elapsed.TotalSeconds, poCount, poCount == 1 ? "" : "s"); } this.ProcessOutcome(checker, vcOutcome, errors, timeIndication, this.Stats); if (vcOutcome == VC.VCGen.Outcome.Errors || WhoopRaceCheckerCommandLineOptions.Get().Trace) { Console.Out.Flush(); } WhoopRaceCheckerCommandLineOptions.Get().TheProverFactory.Close(); // cce.NonNull(WhoopRaceCheckerCommandLineOptions.Get().TheProverFactory).Close(); vcgen.Dispose(); if (WhoopRaceCheckerCommandLineOptions.Get().MeasurePassExecutionTime) { this.Timer.Stop(); Console.WriteLine(" | |------ [StaticLocksetAnalyser] {0}", this.Timer.Result()); Console.WriteLine(" |"); } }
private void CheckForRaces() { this.AC.EliminateDeadVariables(); this.AC.Inline(); if (ToolCommandLineOptions.Get().LoopUnrollCount != -1) { this.AC.BoogieProgram.UnrollLoops(ToolCommandLineOptions.Get().LoopUnrollCount, ToolCommandLineOptions.Get().SoundLoopUnrolling); } VC.ConditionGeneration vcgen = null; try { vcgen = new VC.VCGen(this.AC.BoogieProgram, ToolCommandLineOptions.Get().SimplifyLogFilePath, ToolCommandLineOptions.Get().SimplifyLogFileAppend, new List <Checker>()); } catch (ProverException e) { Lockpwn.IO.Reporter.ErrorWriteLine("Fatal Error: ProverException: {0}", e); Environment.Exit((int)Outcome.FatalError); } int prevAssertionCount = vcgen.CumulativeAssertionCount; List <Counterexample> errors; DateTime start = new DateTime(); if (ToolCommandLineOptions.Get().Trace) { start = DateTime.UtcNow; if (ToolCommandLineOptions.Get().Trace) { Output.PrintLine(""); Output.PrintLine("Verifying {0} ...", this.AC.EntryPoint.Name.Substring(5)); } } GC.Collect(); VC.VCGen.Outcome vcOutcome; try { vcOutcome = vcgen.VerifyImplementation(this.AC.EntryPoint, out errors); } catch (VC.VCGenException e) { Lockpwn.IO.Reporter.ReportBplError(this.AC.EntryPoint, String.Format("Error BP5010: {0} Encountered in implementation {1}.", e.Message, this.AC.EntryPoint.Name), true, true); errors = null; this.AC.GetErrorReporter().Result = ErrorReporter.Outcome.Inconclusive; vcOutcome = VC.VCGen.Outcome.Inconclusive; GC.Collect(); } catch (UnexpectedProverOutputException e) { Lockpwn.IO.Reporter.WarningWriteLine("Warning: unexpected prover output: {0}", e.Message); errors = null; this.AC.GetErrorReporter().Result = ErrorReporter.Outcome.Inconclusive; vcOutcome = VC.VCGen.Outcome.Inconclusive; GC.Collect(); } catch (OutOfMemoryException) { Lockpwn.IO.Reporter.WarningWriteLine("Warning: run out of memory during VC verification"); errors = null; this.AC.GetErrorReporter().Result = ErrorReporter.Outcome.OutOfMemory; vcOutcome = VC.VCGen.Outcome.OutOfMemory; GC.Collect(); } catch (Exception ex) { Lockpwn.IO.Reporter.WarningWriteLine("Warning: VC verification failed: " + ex.Message); errors = null; this.AC.GetErrorReporter().Result = ErrorReporter.Outcome.Inconclusive; vcOutcome = VC.VCGen.Outcome.Inconclusive; GC.Collect(); } string timeIndication = ""; DateTime end = DateTime.UtcNow; TimeSpan elapsed = end - start; if (ToolCommandLineOptions.Get().Trace) { int poCount = vcgen.CumulativeAssertionCount - prevAssertionCount; timeIndication = string.Format(" [{0:F3} s, {1} proof obligation{2}] ", elapsed.TotalSeconds, poCount, poCount == 1 ? "" : "s"); } this.ProcessOutcome(this.AC.EntryPoint, vcOutcome, errors, timeIndication, this.Stats); if (vcOutcome == VC.VCGen.Outcome.Errors || ToolCommandLineOptions.Get().Trace) { Console.Out.Flush(); } ToolCommandLineOptions.Get().TheProverFactory.Close(); cce.NonNull(ToolCommandLineOptions.Get().TheProverFactory).Close(); vcgen.Dispose(); Lockpwn.IO.Reporter.WriteTrailer(this.Stats); }