Esempio n. 1
0
        public void BlockCloner_CloneCall()
        {
            var call   = new CallInstruction(new ProcedureConstant(arch.PointerType, procCalling), new CallSite(0, 0));
            var cloner = new BlockCloner(null, procCalling, callgraph);
            var block  = new Block(procCalling, "test");

            cloner.Statement = new Statement(42, call, block);
            var newCall = (CallInstruction)call.Accept(cloner);

            Assert.AreEqual(call.Callee, newCall.Callee);
            Assert.AreEqual(1, callgraph.CallerStatements(procCalling).Count(), "Should've added a call to the callgraph");
        }
Esempio n. 2
0
        public void BlockCloner_Store()
        {
            var proc = BuildTest("fn01010", m =>
            {
                var r1 = m.Register("r1");
                m.MStore(r1, r1);
                m.Return();
            });

            var block    = proc.EntryBlock.Succ[0];
            var cloner   = new BlockCloner(block, procCalling, callgraph);
            var blockNew = cloner.Execute();
        }
Esempio n. 3
0
        public void BlockCloner_CloneBin()
        {
            var proc = BuildTest("fn1000", m =>
            {
                var r1 = m.Register("r1");
                var r2 = m.Register("r2");
                m.Assign(r1, m.IAdd(r1, r2));
                m.Return();
            });
            var block = proc.ControlGraph.Blocks[2];

            var blockCloner = new BlockCloner(block, procCalling, callgraph);
            var blockNew = blockCloner.Execute();

            var assNew = (Assignment) blockNew.Statements[0].Instruction;
            Assert.AreEqual("r1 = r1 + r2", assNew.ToString());
        }
Esempio n. 4
0
        public void BlockCloner_CloneBin()
        {
            var proc = BuildTest("fn1000", m =>
            {
                var r1 = m.Register("r1");
                var r2 = m.Register("r2");
                m.Assign(r1, m.IAdd(r1, r2));
                m.Return();
            });
            var block = proc.ControlGraph.Blocks[2];

            var blockCloner = new BlockCloner(block, procCalling, callgraph);
            var blockNew    = blockCloner.Execute();

            var assNew = (Assignment)blockNew.Statements[0].Instruction;

            Assert.AreEqual("r1 = r1 + r2", assNew.ToString());
        }
Esempio n. 5
0
        public void BlockCloner_CloneBlock()
        {
            var m = new ProcedureBuilder(arch, "fn1000");
            var r1 = m.Register("r1");
            var r2 = m.Register("r2");
            var ass = m.Assign(r1, r2);
            m.Return();
            var block = m.Procedure.ControlGraph.Blocks[2];

            m = new ProcedureBuilder(arch, "procCalling");

            var blockCloner = new BlockCloner(block, m.Procedure, callgraph);
            var blockNew = blockCloner.Execute();

            var assNew = (Assignment) blockNew.Statements[0].Instruction;
            Assert.AreNotSame(ass.Dst, assNew.Dst);
            Assert.AreNotSame(ass.Src, assNew.Src);
        }
Esempio n. 6
0
        public void BlockCloner_CloneTwoBlocks()
        {
            var proc = BuildTest("fn01010", m =>
            {
                var r1 = m.Register("r1");
                m.Assign(r1, m.Mem32(r1));
                m.Goto("next");
                m.Label("next");
                m.Assign(r1, m.Mem32(m.Word32(0x123123)));
                m.Return();
            });

            var block    = proc.EntryBlock.Succ[0];
            var cloner   = new BlockCloner(block, procCalling, callgraph);
            var blockNew = cloner.Execute();

            Assert.AreEqual(4, procCalling.ControlGraph.Blocks.Count, "2 for entry and exit, 2 for cloned blocks");
            Assert.AreSame(procCalling.ExitBlock, blockNew.Succ[0].Succ[0]);
        }
Esempio n. 7
0
        public void BlockCloner_CloneMem()
        {
            var proc = BuildTest("fn1000", m =>
            {
                var r1 = m.Register("r1");
                var r2 = m.Register("r2");
                m.Assign(r1, m.Mem32(r2));
                m.Return();
            });
            var block = proc.ControlGraph.Blocks[2];

            var blockCloner = new BlockCloner(block, procCalling, callgraph);
            var blockNew    = blockCloner.Execute();

            var assNew = (Assignment)blockNew.Statements[0].Instruction;

            Assert.AreEqual("r1 = Mem0[r2:word32]", assNew.ToString());
            Assert.AreNotSame(proc.Frame.Memory, ((MemoryAccess)assNew.Src).MemoryId);
        }
Esempio n. 8
0
        public void BlockCloner_CloneBlock()
        {
            var m   = new ProcedureBuilder(arch, "fn1000");
            var r1  = m.Register("r1");
            var r2  = m.Register("r2");
            var ass = m.Assign(r1, r2);

            m.Return();
            var block = m.Procedure.ControlGraph.Blocks[2];

            m = new ProcedureBuilder(arch, "procCalling");

            var blockCloner = new BlockCloner(block, m.Procedure, callgraph);
            var blockNew    = blockCloner.Execute();

            var assNew = (Assignment)blockNew.Statements[0].Instruction;

            Assert.AreNotSame(ass.Dst, assNew.Dst);
            Assert.AreNotSame(ass.Src, assNew.Src);
        }
Esempio n. 9
0
        public void BlockCloner_CloneCall()
        {
            var call   = new CallInstruction(new ProcedureConstant(arch.PointerType, procCalling), new CallSite(0, 0));
            var block  = new Block(procCalling, procCalling.EntryAddress, "test");
            var stmOld = new Statement(42, call, block);

            callgraph.AddEdge(stmOld, procCalling);

            var cloner = new BlockCloner(null, procCalling, callgraph);

            cloner.Statement    = stmOld;
            cloner.StatementNew = new Statement(42, null, block);
            var newCall = (CallInstruction)call.Accept(cloner);

            cloner.StatementNew.Instruction = newCall;
            Assert.AreEqual(call.Callee, newCall.Callee);
            Assert.AreEqual(2, callgraph.CallerStatements(procCalling).Count(), "Should've added a call to the callgraph");
            Assert.AreEqual(1, callgraph.Callees(cloner.Statement).Count());
            Assert.AreEqual(1, callgraph.Callees(cloner.StatementNew).Count());
        }
Esempio n. 10
0
        public void BlockCloner_CloneBlock_Temporaries()
        {
            var m   = new ProcedureBuilder(arch, "fn1000");
            var tmp = m.Frame.CreateTemporary(PrimitiveType.Word32);
            var r2  = m.Register("r2");
            var ass = m.Assign(tmp, r2);
            var sto = (Store)m.MStore(m.Word32(0x00123400), tmp).Instruction;

            m.Return();
            var block = m.Procedure.ControlGraph.Blocks[2];

            m = new ProcedureBuilder(arch, "procCalling");

            var blockCloner = new BlockCloner(block, m.Procedure, callgraph);
            var blockNew    = blockCloner.Execute();

            var assNew = (Assignment)blockNew.Statements[0].Instruction;
            var stoNew = (Store)blockNew.Statements[1].Instruction;

            Assert.AreNotSame(ass.Dst, assNew.Dst);
            Assert.AreNotSame(sto.Src, stoNew.Src);
            Assert.AreSame(assNew.Dst, stoNew.Src);
        }
Esempio n. 11
0
 private Block CloneBlockIntoOtherProcedure(Block block, Procedure proc)
 {
     Debug.Print("Cloning {0} to {1}", block.Name, proc);
     var clonedBlock = new BlockCloner(block, proc, program.CallGraph).Execute();
     //ReplaceSuccessorsWith(pred, block, clonedBlock);
     //pred.Procedure.ControlGraph.Blocks.Remove(block);
     return clonedBlock;
 }
Esempio n. 12
0
        public void BlockCloner_CloneMem()
        {
            var proc = BuildTest("fn1000", m =>
            {
                var r1 = m.Register("r1");
                var r2 = m.Register("r2");
                m.Assign(r1, m.LoadDw(r2));
                m.Return();
            });
            var block = proc.ControlGraph.Blocks[2];

            var blockCloner = new BlockCloner(block, procCalling, callgraph);
            var blockNew = blockCloner.Execute();

            var assNew = (Assignment) blockNew.Statements[0].Instruction;
            Assert.AreEqual("r1 = Mem0[r2:word32]", assNew.ToString());
            Assert.AreNotSame(proc.Frame.Memory, ((MemoryAccess) assNew.Src).MemoryId);
        }
Esempio n. 13
0
        public void BlockCloner_Store()
        {
            var proc = BuildTest("fn01010", m =>
            {
                var r1 = m.Register("r1");
                m.Store(r1, r1);
                m.Return();
            });

            var block = proc.EntryBlock.Succ[0];
            var cloner = new BlockCloner(block, procCalling, callgraph);
            var blockNew = cloner.Execute();
        }
Esempio n. 14
0
 public void BlockCloner_CloneCall()
 {
     var call = new CallInstruction(new ProcedureConstant(arch.PointerType, procCalling), new CallSite(0, 0));
     var cloner = new BlockCloner(null, procCalling, callgraph);
     var block = new Block(procCalling, "test");
     cloner.Statement = new Statement(42, call, block);
     var newCall = (CallInstruction) call.Accept(cloner);
     Assert.AreEqual(call.Callee, newCall.Callee);
     Assert.AreEqual(1, callgraph.CallerStatements(procCalling).Count(), "Should've added a call to the callgraph");
 }
Esempio n. 15
0
        public void BlockCloner_CloneTwoBlocks()
        {
            var proc = BuildTest("fn01010", m =>
            {
                var r1 = m.Register("r1");
                m.Assign(r1, m.LoadDw(r1));
                m.Jump("next");
                m.Label("next");
                m.Assign(r1, m.LoadDw(m.Word32(0x123123)));
                m.Return();
            });

            var block = proc.EntryBlock.Succ[0];
            var cloner = new BlockCloner(block, procCalling, callgraph);
            var blockNew = cloner.Execute();

            Assert.AreEqual(4, procCalling.ControlGraph.Blocks.Count, "2 for entry and exit, 2 for cloned blocks");
            Assert.AreSame(procCalling.ExitBlock, blockNew.Succ[0].Succ[0]);
        }