public void TestDecodeDigitPairs() { Z3Provider solver = new Z3Provider(); var st = BekConverter.BekFileToSTb(solver, sampleDir + "bek/DecodeDigitPairs.bek"); //st.ShowGraph(); var f1 = st.Explore(); //convert to SFT by exploring the register //f1.ToCSt("../../../src/Bek.Query.Tests/DecodeDigitPairs.cs", "", "Experiments", "DecodeDigitPairs"); //f1.ToDot("../../../src/Bek.Query.Tests/DecodeDigitPairs.dot"); //f1.ShowGraph(); var f = f1.ToST(); var fof = f + f; //functional composition bool idempotent = f.Eq1(fof); //check idempotence if (!idempotent) { var w = f.Diff(fof); //find a witness where f and fof differ string input = w.Input.StringValue; // e.g. "5555" string output1 = w.Output1.StringValue; // e.g. f("5555") == "77" string output2 = w.Output2.StringValue; // e.g. f(f("5555")) == "M" Console.WriteLine("not idempotent, witness: {0}, {1}, {2}", input, output1, output2); } else { Console.WriteLine("idempotent"); } }
public void TestSFTwithPC() { var solver = new Z3Provider(); var d = System.Environment.CurrentDirectory; var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/decode.bek").ExploreBools(); //stb.ShowGraph(10); }
//[TestMethod] public void TestCssEncode5() { var solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode5.bek"); //stb.Explore().ShowGraph(); var st = stb.ToST(); //st.ShowGraph(10); var sft = st.Explore(); //sft.ShowGraph(10); //just to get longer input strings var restr = sft.RestrictDomain("(.){3,}$"); restr.Simplify(); //restr.ShowGraph(10); restr.AssertTheory(); Expr inputConst = solver.MkFreshConst("input", sft.InputListSort); Expr outputConst = solver.MkFreshConst("output", sft.OutputListSort); solver.MainSolver.Assert(restr.MkAccept(inputConst, outputConst)); int okCnt = 0; int error0Cnt = 0; int error1Cnt = 0; //validate correctness for some values against the actual CssEncode //TBD: validate also exceptional behavior int K = 10; for (int i = 0; i < K; i++) { var model = solver.MainSolver.GetModel(solver.True, inputConst, outputConst); string input = model[inputConst].StringValue; string output = model[outputConst].StringValue; Assert.IsFalse(string.IsNullOrEmpty(input)); Assert.IsFalse(string.IsNullOrEmpty(output)); if ((input != "")) { char lastChar = '\0'; //output[output.Length - 1]; try { var output_expected = System.Web.Security.AntiXss.AntiXssEncoder.CssEncode(input); Assert.AreEqual <string>(output_expected, output); okCnt += 1; } catch (Exception) { Assert.AreEqual <char>('\0', lastChar); error0Cnt += 1; } } //exclude this solution, before picking the next one solver.MainSolver.Assert(solver.MkNeq(inputConst, model[inputConst].Value)); } Assert.AreEqual(K, okCnt); }
public void TestDecodeDigitPairsDotGen() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/DecodeDigitPairs.bek"); stb.ToDot("DecodeDigitPairs.dot"); var sft = stb.Explore(); sft.ToDot("DecodeDigitPairs_F.dot"); }
public void TestCssEncodeBekRoundtrip() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek"); var sb = new StringBuilder(); stb.ToBek(sb); var stb2 = BekConverter.BekToSTb(solver, sb.ToString()); CheckFullEquivalence(stb, stb2); }
public void TestCssEncodeDomainDotGen() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek"); var sfa = stb.ToST().ToSFA().Determinize().Minimize(); Assert.AreEqual<int>(2, sfa.StateCount); sfa.SaveAsDot("CssEncode_Dom.dot"); //sfa.ShowGraph(); }
public void TestHtmlDecode() { int k = 3134 % 100; int foo = 0xff41; Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/HtmlDecode.bek"); var st = stb.ExploreBools().ToST(); //st.ShowGraph(); }
public void TestCssEncodeCSgen() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek"); stb.ToCS("CssEncode.cs", "Test", "CssEncode", false, true); var st1 = stb.ExploreBools(); st1.ToCS("CssEncode_B.cs", "Test", "CssEncode_B", false, true); var sft = stb.Explore(); sft.ToCS("CssEncode_F.cs", "Test", "CssEncode_F", false, true); }
public void TestCssEncodeDotGen() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode.bek"); stb.ToDot(15, "CssEncode.dot"); var st1 = stb.ExploreBools(); st1.ToDot(15, "CssEncode_B.dot"); var sft = stb.Explore(); sft.ToDot(15, "CssEncode_F.dot"); }
public void TestBitsBug() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/BitsBug.bek"); var sft = stb; // stb.Explore(); var bitsbug = stb.Compile("Microsoft.Bek.Tests", "BitsBug", true); int c = 15; int k = ((1 + (c & 7)) & 3); string res = bitsbug.Apply(((char)c).ToString()); Assert.AreEqual<int>(1, res.Length); Assert.AreEqual<int>(k, (int)res[0]); }
public void TestExploreBools() { var solver = new Z3Provider(); var stb5 = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode5.bek"); var stb6 = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode4.bek"); //stb6.ShowGraph(10); var fst6 = stb6.ExploreBools(); //fst6.ShowGraph(); var fst5 = stb5.ExploreBools(); //fst5.ShowGraph(); //fst5.Name = "CssEncode5"; //fst5.ShowGraph(20); CheckFullEquivalence(fst5.ToST(), fst6.ToST()); }
public void TestUTF8DecodeDomain() { Z3Provider solver = new Z3Provider(); var dec = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Decode.bek").ToST(); var decDom = dec.ToSFA(); //decDom.ShowGraph(); var one = @"[\x00-\x7F]"; var two = @"[\xC2-\xDF][\x80-\xBF]"; var thr = @"(\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|[\xE1-\xEC\xEE\xEF][\x80-\xBF])[\x80-\xBF]"; var fou = @"(\xF0[\x90-\xBF]|[\xF1-\xF3][\x80-\xBF]|\xF4[\x80-\x8F])[\x80-\xBF]{2}"; var regex = string.Format("^(({0})|({1})|({2})|({3}))*$", one, two, thr, fou); var aut = solver.RegexConverter.Convert(regex); //solver.CharSetProvider.ShowGraph(solver.CharSetProvider.Convert(regex).Minimize(solver.CharSetProvider), "temp"); var sfa = new SFAModel(solver, solver.CharacterSort, aut); //sfa.ShowGraph(); bool equiv = aut.IsEquivalentWith(decDom.Automaton, solver); Assert.IsTrue(equiv); }
public void TestCssEncode4eq5() { var solver = new Z3Provider(); var stb5 = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode5.bek"); var stb4 = BekConverter.BekFileToSTb(solver, sampleDir + "bek/CssEncode4.bek"); //stb5.ShowGraph(10); var fst4 = stb4.ToST().Explore(); var fst5 = stb5.ToST().Explore(); var dom4 = fst4.ToSFA(); var dom5 = fst5.ToSFA(); bool dom4_subsetof_dom5 = dom4.IsSubsetOf(dom5); //var tmp = dom4.Minus(dom5); //tmp.ShowGraph(); //var member = new List<Expr>(tmp.ChoosePathToSomeFinalState()).ToArray(); //var str = new String(Array.ConvertAll(member, m => solver.GetCharValue(solver.FindOneMember(m).Value))); bool dom5_subsetof_dom4 = dom5.IsSubsetOf(dom4); bool partial_equiv = fst4.Eq1(fst5); Assert.IsTrue(dom4_subsetof_dom5); Assert.IsTrue(partial_equiv); Assert.IsTrue(dom5_subsetof_dom4); }
//[TestMethod] public void TestUTF8Encode() { Z3Provider solver = new Z3Provider(); var stb = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Encode.bek"); var tmp = stb.ToST(); var sft = stb.Explore(); var sft1 = sft.ToST(); //sft.ShowGraph(); //sft1.SaveAsDot("C:/tmp/dot/utf8encode.dot"); #region data for the popl paper var st = sft.ToST(); int n = st.StateCount; var moves = new List<Move<Rule<Expr>>>(st.GetMoves()); moves.RemoveAll(x => x.Label.IsFinal); int m = moves.Count; int t = System.Environment.TickCount; var st_o_st = st + st; int n1 = st_o_st.StateCount; var moves1 = new List<Move<Rule<Expr>>>(st_o_st.GetMoves()); moves1.RemoveAll(y => y.Label.IsFinal); int m1 = moves1.Count; bool diff = st.Eq1(st_o_st); t = System.Environment.TickCount - t; #endregion var restr = sft.ToST().RestrictDomain(".+"); restr.AssertTheory(); Expr inputConst = solver.MkFreshConst("input", restr.InputListSort); Expr outputConst = solver.MkFreshConst("output", restr.OutputListSort); solver.MainSolver.Assert(restr.MkAccept(inputConst, outputConst)); //validate correctness for some values against the actual UTF8Encode //TBD: validate also exceptional behavior, when the generated code throws an exception //the builtin one must contain the character 0xFFFD int K = 50; for (int i = 0; i < K; i++) { var model = solver.MainSolver.GetModel(solver.True, inputConst, outputConst); string input = model[inputConst].StringValue; string output = model[outputConst].StringValue; Assert.IsFalse(string.IsNullOrEmpty(input)); Assert.IsFalse(string.IsNullOrEmpty(output)); byte[] encoding = Encoding.UTF8.GetBytes(input); char[] chars = Array.ConvertAll(encoding, b => (char)b); string output_expected = new String(chars); string output_generated = UTF8Encode_F.Apply(input); string output_generated2 = UTF8Encode.Apply(input); string output_generated3 = UTF8Encode_B.Apply(input); Assert.AreEqual<string>(output_expected, output_generated); Assert.AreEqual<string>(output_expected, output_generated2); Assert.AreEqual<string>(output_expected, output_generated3); Assert.AreEqual<string>(output_expected, output); //exclude this solution, before picking the next one solver.MainSolver.Assert(solver.MkNeq(inputConst, model[inputConst].Value)); } }
//[TestMethod] public void TestUTF8Decode() { Z3Provider solver = new Z3Provider(); var dec = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Decode.bek").ToST().ExploreBools(); var enc = BekConverter.BekFileToSTb(solver, sampleDir + "bek/UTF8Encode.bek").ToST().Explore(); var id = STModel.MkId(solver, solver.CharacterSort); //var id = BekConverter.BekFileToSTb(solver, sampleDir + "bek/identity.bek").ToST(); var ed = enc + dec; //first encode then decode var de = dec + enc; //first decode then encode ed.Simplify(); //ed.ShowGraph(10); //ed.ShowGraph(5); //return; //id.ShowGraph(); //de.ShowGraph(5); int timeE = System.Environment.TickCount; var encF = enc.Explore(); timeE = System.Environment.TickCount - timeE; int timeD = System.Environment.TickCount; var decF = dec.Explore(); timeD = System.Environment.TickCount - timeD; decF.Simplify(); Console.WriteLine(timeE); Console.WriteLine(timeD); var encRuleCnt = encF.MoveCount; var decRuleCnt = decF.MoveCount; var tmp = new Dictionary<Expr,int>(); int m = 0; //foreach (var move in decF.GetMoves()) //{ // int k = 0; // if (move.Condition.IsFinal && move.Condition.Guard.Equals(solver.True)) // k = 1; // else if (!tmp.TryGetValue(move.Condition.Guard, out k)) // { // foreach (var v in solver.FindAllMembers(move.Condition.Guard)) // k += 1; // tmp[move.Condition.Guard] = k; // } // m += k; //} //var dec_filtered = dec.RestrictDomain(@"^[^\xE0\xED\xF0\xF4]*$"); //dec_filtered.ShowGraph(5); //var dec_filtered_e = dec_filtered.Explore(); //int stateCount = dec_filtered_e.StateCount; //int moveCount = dec_filtered_e.MoveCount; string utf16 = @"^([\0-\uD7FF\uE000-\uFFFF]|([\uD800-\uDBFF][\uDC00-\uDFFF]))*$"; var one = @"[\x00-\x7F]"; var two = @"[\xC2-\xDF][\x80-\xBF]"; var thr = @"(\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|[\xE1-\xEC\xEE\xEF][\x80-\xBF])[\x80-\xBF]"; var fou = @"(\xF0[\x90-\xBF]|[\xF1-\xF3][\x80-\xBF]|\xF4[\x80-\x8F])[\x80-\xBF]{2}"; var utf8 = string.Format("^(({0})|({1})|({2})|({3}))*$", one, two, thr, fou); var UTF_8 = new SFAModel(solver, solver.CharacterSort, solver.RegexConverter.Convert(utf8).Determinize(solver).MinimizeHopcroft(solver)); //UTF_8.ShowGraph(); //var F0 = new SFAModel(solver, solver.CharacterSort, solver.RegexConverter.Convert("^(\xF0[\0-\uFFFF]{3})*$").Determinize(solver).Minimize(solver)); //var decF0 = dec.RestrictDomain(F0); //var decF0_E = decF0.Explore(); //var surr = @"^([\uD800-\uDBFF][\uDC00-\uDFFF])*$"; //var ed_surr = ed.RestrictDomain(surr); //ed_surr.Simplify(); //ed_surr.ShowGraph(10); //F0.ShowGraph(); //ed_F0.ShowGraph(5); //var decE = dec.Explore(); //dec.STb.ShowGraph(); //enc.STb.ShowGraph(); var decDom = dec.ToSFA(); var edDom = ed.ToSFA(); var eDom = enc.ToSFA(); var UTF_16 = solver.RegexConverter.Convert(utf16); int timeDEdom = System.Environment.TickCount; var deDom = de.ToSFA(); bool equivDomDE = UTF_8.Automaton.IsEquivalentWith(deDom.Automaton, solver); timeDEdom = System.Environment.TickCount - timeDEdom; Console.WriteLine(timeDEdom); bool equivDom = UTF_16.IsEquivalentWith(edDom.Automaton, solver); Assert.IsTrue(equivDom); bool equivDom2 = UTF_16.IsEquivalentWith(eDom.Automaton, solver); Assert.IsTrue(equivDom2); int time0 = System.Environment.TickCount; bool equiv0 = id.Eq1(ed); time0 = System.Environment.TickCount - time0; int time1 = System.Environment.TickCount; bool equiv1 = id.Eq1(de); time1 = System.Environment.TickCount - time1; Assert.IsTrue(equiv1); Assert.IsTrue(equiv0); int time = System.Environment.TickCount; bool equiv = id.Eq1(ed); time = System.Environment.TickCount - time; Console.WriteLine(time); Assert.IsTrue(equiv); }