public void Test_Runner_Jmp_7() { string programStr = " jz label1 " + Environment.NewLine + " mov rax, 10 " + Environment.NewLine + " jmp label2 " + Environment.NewLine + "label1: " + Environment.NewLine + " mov rax, 20 " + Environment.NewLine + "label2: " + Environment.NewLine + " mov rbx, rax " + Environment.NewLine + " jz label3 " + Environment.NewLine + "label3: "; Tools tools = this.CreateTools(); StaticFlow sFlow = new StaticFlow(tools); sFlow.Update(programStr); tools.StateConfig = sFlow.Create_StateConfig(); //var dFlow = Runner.Construct_DynamicFlow_Backward(sFlow, tools); DynamicFlow dFlow = Runner.Construct_DynamicFlow_Forward(sFlow, tools); //DotVisualizer.SaveToDot(sFlow, dFlow, "test1.dot"); State state = dFlow.EndState; Assert.IsNotNull(state); if (logToDisplay) { Console.WriteLine("state:\n" + state); } TestTools.IsTrue(state.IsConsistent); TestTools.AreEqual(Rn.RAX, "00000000_00000000_00000000_00000000_00000000_00000000_00000000_000????0", state); Microsoft.Z3.BoolExpr branch_Condition = dFlow.Get_Branch_Condition(0); { State state2a = new State(state); state2a.Add(new BranchInfo(branch_Condition, true)); if (logToDisplay) { Console.WriteLine("state with ZF = true:\n" + state2a); } TestTools.IsTrue(state2a.IsConsistent); TestTools.AreEqual(Rn.RAX, 10, state2a); } { State state2b = new State(state); state2b.Add(new BranchInfo(branch_Condition, false)); if (logToDisplay) { Console.WriteLine("state with ZF = false:\n" + state2b); } TestTools.IsTrue(state2b.IsConsistent); TestTools.AreEqual(Rn.RAX, 20, state2b); } }
public void Test_Runner_Mem_Merge_1() { Tools tools = this.CreateTools(); tools.StateConfig.Set_All_Off(); tools.StateConfig.RAX = true; tools.StateConfig.RBX = true; tools.StateConfig.ZF = true; tools.StateConfig.Mem = true; tools.Quiet = true; string programStr = " jz label1 " + Environment.NewLine + " mov byte ptr[rax], 10 " + Environment.NewLine + " jmp label2 " + Environment.NewLine + "label1: " + Environment.NewLine + " mov byte ptr[rax], 20 " + Environment.NewLine + "label2: " + Environment.NewLine + " mov bl, byte ptr[rax] "; StaticFlow sFlow = new StaticFlow(tools); sFlow.Update(programStr); DynamicFlow dFlow = Runner.Construct_DynamicFlow_Backward(sFlow, tools); State state = dFlow.EndState; State state3 = new State(state); State state4 = new State(state); Microsoft.Z3.BoolExpr branch_Condition = dFlow.Get_Branch_Condition(0); state3.Add(new BranchInfo(branch_Condition, true)); if (logToDisplay) { Console.WriteLine("state3:\n" + state3); } TestTools.AreEqual(Rn.BL, 10, state3); state4.Add(new BranchInfo(branch_Condition, false)); if (logToDisplay) { Console.WriteLine("state4:\n" + state4); } TestTools.AreEqual(Rn.BL, 20, state4); }
public void Test_Runner_Jmp_11() { string programStr = " cmp al, 0 " + Environment.NewLine + " jp label1 " + Environment.NewLine + " mov al, 1 " + Environment.NewLine + " jz label1 " + Environment.NewLine + " mov al, 2 " + Environment.NewLine + "label1: "; Tools tools = this.CreateTools(); StaticFlow sFlow = new StaticFlow(tools); sFlow.Update(programStr); if (logToDisplay) { Console.WriteLine(sFlow.ToString()); } tools.StateConfig = sFlow.Create_StateConfig(); DynamicFlow dFlow = Runner.Construct_DynamicFlow_Backward(sFlow, tools); State state = dFlow.EndState; Assert.IsNotNull(state); if (logToDisplay) { Console.WriteLine("state:\n" + state); } TestTools.IsTrue(state.IsConsistent); Microsoft.Z3.BoolExpr branch_Condition_jp = dFlow.Get_Branch_Condition(1); Microsoft.Z3.BoolExpr branch_Condition_jz = dFlow.Get_Branch_Condition(3); if (true) { if (true) { State state2 = new State(state); state2.Add(new BranchInfo(branch_Condition_jp, true)); state2.Add(new BranchInfo(branch_Condition_jz, true)); TestTools.AreEqual(Rn.AL, "00000000", state2); } if (true) { State state2 = new State(state); state2.Add(new BranchInfo(branch_Condition_jp, true)); state2.Add(new BranchInfo(branch_Condition_jz, false)); TestTools.AreEqual(Rn.AL, "????????", state2); } if (true) { State state2 = new State(state); state2.Add(new BranchInfo(branch_Condition_jp, false)); state2.Add(new BranchInfo(branch_Condition_jz, true)); TestTools.AreEqual(Rn.AL, "XXXXXXXX", state2); } if (true) { State state2 = new State(state); state2.Add(new BranchInfo(branch_Condition_jp, false)); state2.Add(new BranchInfo(branch_Condition_jz, false)); TestTools.AreEqual(Rn.AL, "00000010", state2); } } }