Example #1
0
        public static IStateScheduler GetScheduler(CmdLineOpts options)
        {
            IStateScheduler scheduler = null;

            switch (options.scheduler)
            {
            case CmdLineOpts.Scheduler.DFS:
                scheduler = new DFSStateScheduler();
                break;

            case CmdLineOpts.Scheduler.BFS:
                scheduler = new BFSStateScheduler();
                break;

            case CmdLineOpts.Scheduler.UntilEndBFS:
                scheduler = new UntilTerminationBFSStateScheduler();
                break;

            case CmdLineOpts.Scheduler.AltBFS:
                scheduler = new AlternativeBFSStateScheduler();
                break;

            default:
                throw new ArgumentException("Unsupported scheduler");
            }

            if (options.PreferLoopEscapingPaths > 0)
            {
                scheduler = new LoopEscapingScheduler(scheduler);
            }

            if (options.MaxLoopDepth > 0)
            {
                scheduler = new LimitLoopBoundScheduler(scheduler, options.MaxLoopDepth);
            }

            return(scheduler);
        }
Example #2
0
        public void ExploreOrderLoopEscapingScheduler()
        {
            var scheduler = new LoopEscapingScheduler(new DFSStateScheduler());

            p = LoadProgramFrom("programs/TestLoopEscaping.bpl");

            // Get the blocks we need to refer to
            var main          = GetMain(p);
            var loopBodyBlock = main.Blocks.Where(b => b.Label == "anon2_LoopBody").First();
            var loopDoneBlock = main.Blocks.Where(b => b.Label == "anon2_LoopDone").First();

            e = GetExecutor(p, scheduler, GetSolver(), /*useConstantFolding=*/ true);

            var tc = new TerminationCounter();

            tc.Connect(e);

            int changed = 0;

            e.ContextChanged += delegate(object sender, Executor.ContextChangeEventArgs eventArgs)
            {
                switch (changed)
                {
                case 0:
                    Assert.AreSame(loopBodyBlock, eventArgs.Previous.GetCurrentBlock());
                    Assert.IsFalse(eventArgs.Previous.Finished());

                    Assert.AreSame(loopDoneBlock, eventArgs.Next.GetCurrentBlock());
                    Assert.AreEqual(0, GetLoopCounter(eventArgs.Next));
                    Assert.IsFalse(eventArgs.Next.Finished());
                    break;

                case 1:
                    Assert.AreSame(loopDoneBlock, eventArgs.Previous.GetCurrentBlock());
                    Assert.AreEqual(0, GetLoopCounter(eventArgs.Previous));
                    Assert.IsTrue(eventArgs.Previous.Finished());
                    Assert.IsInstanceOf <TerminatedWithoutError>(eventArgs.Previous.TerminationType);

                    Assert.AreSame(loopBodyBlock, eventArgs.Next.GetCurrentBlock());
                    Assert.AreEqual(0, GetLoopCounter(eventArgs.Next));
                    Assert.IsFalse(eventArgs.Next.Finished());
                    break;

                case 2:
                    Assert.AreSame(loopBodyBlock, eventArgs.Previous.GetCurrentBlock());
                    Assert.AreEqual(1, GetLoopCounter(eventArgs.Next));
                    Assert.IsFalse(eventArgs.Next.Finished());

                    Assert.AreSame(loopDoneBlock, eventArgs.Next.GetCurrentBlock());
                    Assert.AreEqual(1, GetLoopCounter(eventArgs.Next));
                    Assert.IsFalse(eventArgs.Next.Finished());
                    break;

                case 3:
                    Assert.AreSame(loopDoneBlock, eventArgs.Previous.GetCurrentBlock());
                    Assert.AreEqual(1, GetLoopCounter(eventArgs.Previous));
                    Assert.IsTrue(eventArgs.Previous.Finished());
                    Assert.IsInstanceOf <TerminatedWithoutError>(eventArgs.Previous.TerminationType);

                    // About to execute last possible execution of loop body
                    Assert.AreSame(loopBodyBlock, eventArgs.Next.GetCurrentBlock());
                    Assert.AreEqual(1, GetLoopCounter(eventArgs.Next));
                    Assert.IsFalse(eventArgs.Next.Finished());
                    break;

                default:
                    Assert.Fail("Too many context changes");
                    break;
                }
                ++changed;
            };

            e.Run(main);

            Assert.AreEqual(3, tc.NumberOfTerminatedStates);
            Assert.AreEqual(3, tc.Sucesses);
            Assert.AreEqual(4, changed);
        }