Beispiel #1
0
        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(" |");
            }
        }
Beispiel #2
0
        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);
        }