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