示例#1
0
        public void BlockTerminates()
        {
            var m = new ProcedureBuilder();

            m.Call(exit, 4);
            var b = m.CurrentBlock;

            m.Return();

            var a = new TerminationAnalysis(flow, eventListener);

            flow[b] = CreateBlockFlow(b, m.Frame);
            a.Analyze(b);
            Assert.IsTrue(flow[b].TerminatesProcess);
        }
示例#2
0
        public void TerminatingApplication()
        {
            var test = CompileProcedure("test", m =>
            {
                m.SideEffect(m.Fn(new ProcedureConstant(PrimitiveType.Pointer32, exit)));
                m.FinishProcedure();
            });
            var prog = progMock.BuildProgram();

            flow = new ProgramDataFlow(prog);
            var a = new TerminationAnalysis(flow, eventListener);

            a.Analyze(test);
            Assert.IsTrue(flow[test].TerminatesProcess);
        }
示例#3
0
        public void ProcedureTerminatesIfBlockTerminates()
        {
            var proc = CompileProcedure("proc", delegate(ProcedureBuilder m)
            {
                m.Call(exit, 4);
                m.Return();
            });
            var prog = progMock.BuildProgram();

            flow = new ProgramDataFlow(prog);
            var a = new TerminationAnalysis(flow, eventListener);

            a.Analyze(proc);
            Assert.IsTrue(flow[proc].TerminatesProcess);
        }
示例#4
0
        public void ProcedureDoesntTerminatesIfOneBranchDoesnt()
        {
            var proc = CompileProcedure("proc", delegate(ProcedureBuilder m)
            {
                m.BranchIf(m.Eq(m.Local32("foo"), m.Word32(0)), "bye");
                m.Call(exit, 4);
                m.Label("bye");
                m.Return();
            });
            var prog = progMock.BuildProgram();

            flow = new ProgramDataFlow(prog);
            var a = new TerminationAnalysis(flow, eventListener);

            a.Analyze(proc);
            Assert.IsFalse(flow[proc].TerminatesProcess);
        }
示例#5
0
        public void BlockDoesntTerminate()
        {
            var m = new ProcedureBuilder();

            m.Store(m.Word32(0x1231), m.Byte(0));
            var b = m.Block;

            m.Return();
            var a = new TerminationAnalysis(flow, eventListener);

            program = new Program
            {
                Architecture = new FakeArchitecture()
            };
            flow[b] = CreateBlockFlow(b, m.Frame);
            a.Analyze(b);
            Assert.IsFalse(flow[b].TerminatesProcess);
        }
示例#6
0
        public void ProcedureTerminatesIfAllBranchesDo()
        {
            var proc = CompileProcedure("proc", m =>
            {
                m.BranchIf(m.Eq(m.Local32("foo"), m.Word32(0)), "whee");
                m.Call(exit, 4);
                m.FinishProcedure();
                m.Label("whee");
                m.Call(exit, 4);
                m.FinishProcedure();
            });
            var prog = progMock.BuildProgram();

            flow = new ProgramDataFlow(prog);
            var a = new TerminationAnalysis(flow, eventListener);

            a.Analyze(proc);
            Assert.IsTrue(flow[proc].TerminatesProcess);
        }
示例#7
0
        public void TerminatingSubProcedure()
        {
            var sub = CompileProcedure("sub", m =>
            {
                m.Call(exit, 4);
                m.FinishProcedure();
            });

            Procedure caller = CompileProcedure("caller", m =>
            {
                m.Call(sub, 4);
                m.Return();
            });

            var prog = progMock.BuildProgram();

            flow = new ProgramDataFlow(prog);
            var a = new TerminationAnalysis(flow, eventListener);

            a.Analyze(prog);
            Assert.IsTrue(flow[sub].TerminatesProcess);
            Assert.IsTrue(flow[caller].TerminatesProcess);
        }