def executeSinglePlSqlFile(data, spec): f = open(data, 'r') linesOfCode = len(f.readlines()) f.close() processor = PreProcessor(spec, data) tableInfo, assumeConstraintList, assertConstraintList, resultString = processor.start( ) file = open('wpc/upper_input.sql', "w") file.write(resultString) file.close() # recording startTime startTime1 = datetime.datetime.now() input = FileStream('wpc/upper_input.sql') lexer = PlSqlLexer(input) stream = CommonTokenStream(lexer) parser = PlSqlParser(stream) tree = parser.sql_script() cfg = MyCFG() helper = MyHelper(parser) helper.updateTableDict(tableInfo) utility = MyUtility(helper) v = MyVisitor(parser, cfg, utility) v.visit(tree) print("\nRaw CFG :", v.rawCFG, "\n") # for key in v.cfg.nodes: # if v.cfg.nodes[key].ctx != None: # print(key, " --> ", v.cfg.nodes[key].ctx.getText()) # print("\n") res = MyRawCfgToGraph(v.rawCFG, cfg) res.execute() # cfg.printPretty() # print("\n") utility.generateVariableSet(cfg) # all properties of each node # for nodeId in cfg.nodes: # cfg.nodes[nodeId].printPretty() ssaString = MySsaStringGenerator(cfg, parser) ssaString.execute( ) # only for generating DOT file for "before_versioning_graph" # recording finishTime finishTime1 = datetime.datetime.now() # cfg.dotToPng(cfg.dotGraph, "wpc/raw_graph") # # hello1 = utility.generateBeforeVersioningDotFile(cfg) # cfg.dotToPng(hello1, "wpc/before_versioning_graph") # recording startTime startTime2 = datetime.datetime.now() algo = WpcGenerator(cfg, helper, ssaString) algo.execute() algo.finalWpcString = algo.finalWpcString.replace(" ", " ") # done: replace " = " with " == " in algo.finalWpcString algo.finalWpcString = algo.finalWpcString.replace(" = ", " == ") print("\n**** Final WPC VC in Well_Bracketted_Format:\n\n", algo.finalWpcString, "\n") # print(algo.variablesForZ3) # algo.finalWpcString = "( ( z ) ^ ( ( ! ( y ) ) ==> ( ( ( 2 ) v ( x ) ) ==> ( y - 2 ) ) ) )" # for testing! Don't UNCOMMENT... # algo.finalWpcString = "( ( ( z ) ==> ( u ) ) ^ ( ( ! ( y ) ) ==> ( ( ( true ) ) ==> ( y - 2 ) ) ) )" # for testing! Don't UNCOMMENT... # algo.finalWpcString = "( ( ( z ) ==> ( u ) ) ^ ( ( ! ( y ) ) ==> ( true ) ) ^ ( ( a ) ==> ( b ) ) )" # for testing! Don't UNCOMMENT... # algo.finalWpcString = "( ( ( ! ( y ) ) ==> ( true ) ) )" # for testing! Don't UNCOMMENT... # algo.finalWpcString = "( ( ( ! ( y ) ) ^ ( true ) v ( g ) ) )" # for testing! Don't UNCOMMENT... z3StringConvertor = WpcStringConverter(algo.finalWpcString) z3StringConvertor.execute() # z3StringConvertor.convertedWpc is the FINAL VC Generated... print("\n**** Final WPC VC in Z3 Format:\n\n", z3StringConvertor.convertedWpc, "\n") z3FileString = "# This file was generated at runtime on " + str( datetime.datetime.now()) + "\n" z3FileString = z3FileString + "from z3 import *\n\n" z3FileString = z3FileString + "class Z3RuntimeWpcFile():\n" z3FileString = z3FileString + "\t" + "def __init__(self):\n" z3FileString = z3FileString + "\t\t" + "self.finalFormula = \"\"\n" z3FileString = z3FileString + "\t\t" + "self.satisfiability = \"\"\n" z3FileString = z3FileString + "\t\t" + "self.modelForViolation = \"\"\n\n" z3FileString = z3FileString + "\t" + "def execute(self):\n" for i in algo.variablesForZ3: z3FileString = z3FileString + "\t\t" + i + " = Real(\'" + i + "\')\n" z3FileString = z3FileString + "\n\t\ts = Solver()\n" if len(z3StringConvertor.implies_p) > 0: for i in range(len(z3StringConvertor.implies_p)): z3FileString = z3FileString + "\t\t" + "s.add(" + z3StringConvertor.implies_p[ i] + ")\n" if not z3StringConvertor.convertedWpc == z3StringConvertor.implies_p_q[ i]: z3FileString = z3FileString + "\t\t" + "s.add(" + z3StringConvertor.implies_p_q[ i] + ")\n" z3FileString = z3FileString + "\t\t" + "s.add( Not( " + z3StringConvertor.convertedWpc + " ) )\n" # z3FileString = z3FileString + "\n\t\t" + "print()" z3FileString = z3FileString + "\n\t\t" + "#print(\"\\n%%%%%%%%%% Aggregate Formula %%%%%%%%%%\\n\", s)" z3FileString = z3FileString + "\n\t\t" + "self.finalFormula = str(s)" # z3FileString = z3FileString + "\n\t\t" + "print()" z3FileString = z3FileString + "\n\t\t" + "#print(\"\\n%%%%%%%%%% Satisfiability %%%%%%%%%%\")\n" z3FileString = z3FileString + "\n\t\t" + "self.satisfiability = str(s.check())" z3FileString = z3FileString + "\n\t\t" + "if self.satisfiability == \"sat\":" # z3FileString = z3FileString + "\n\t\t\t" + "print()" z3FileString = z3FileString + "\n\t\t\t" + "#print(\"\\n-------->> Violation Occurred...\")" z3FileString = z3FileString + "\n\t\t\t" + "self.satisfiability = \"violation\"" # z3FileString = z3FileString + "\n\t\t\t" + "print()" z3FileString = z3FileString + "\n\t\t\t" + "#print(\"\\n%%%%%%%%%% An Instance for which Violation Occurred %%%%%%%%%%\\n\", s.model())" z3FileString = z3FileString + "\n\t\t\t" + "self.modelForViolation = str(s.model())" z3FileString = z3FileString + "\n\t\t" + "elif self.satisfiability == \"unsat\":" # z3FileString = z3FileString + "\n\t\t\t" + "print()" z3FileString = z3FileString + "\n\t\t\t" + "#print(\"\\n-------->> NO Violation Detected so far...\\n\")" z3FileString = z3FileString + "\n\t\t\t" + "self.satisfiability = \"sat\"" # z3FileString = z3FileString + "\n\t\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t" + "print()\n" file = open('wpc/Z3RuntimeWpcFile.py', "w") file.write(z3FileString) file.close() # time.sleep(2) # import file created on Runtime... import wpc.Z3RuntimeWpcFile from wpc.Z3RuntimeWpcFile import Z3RuntimeWpcFile # Reload after module's creation to avoid old module remain imported from disk...VVI... wpc.Z3RuntimeWpcFile = reload(wpc.Z3RuntimeWpcFile) z3Runtime = Z3RuntimeWpcFile() z3Runtime.execute() # print(z3Runtime.finalFormula) # print(z3Runtime.satisfiability) # print(z3Runtime.modelForViolation) # recording finishTime finishTime2 = datetime.datetime.now() timeDifference = ((finishTime1 - startTime1) + (finishTime2 - startTime2)).total_seconds() return linesOfCode, timeDifference, z3StringConvertor.convertedWpc, z3Runtime.satisfiability, z3Runtime.modelForViolation
def executeSinglePlSqlFile(data, spec): f = open(data, 'r') linesOfCode = len(f.readlines()) f.close() processor = PreProcessor(spec, data) tableInfo, assumeConstraint, assertConstraint, resultString = processor.start( ) file = open('cnf/upper_input.sql', "w") file.write(resultString) file.close() # recording startTime startTime = datetime.datetime.now() input = FileStream('cnf/upper_input.sql') lexer = PlSqlLexer(input) stream = CommonTokenStream(lexer) parser = PlSqlParser(stream) tree = parser.sql_script() # ast = tree.toStringTree(recog=parser) # print(str(MyPlSqlVisitor(parser).getRuleName(tree))) # print("\n\n", signature(tree.toStringTree), "\n") cfg = MyCFG() helper = MyHelper(parser) helper.updateTableDict(tableInfo) utility = MyUtility(helper) v = MyVisitor(parser, cfg, utility) v.visit(tree) print("\nRaw CFG : ", v.rawCFG) # for key in v.cfg.nodes: # if v.cfg.nodes[key].ctx != None: # print(key, " --> ", v.cfg.nodes[key].ctx.getText()) res = MyRawCfgToGraph(v.rawCFG, cfg) res.execute() # cfg.printPretty() # cfg.dotToPng(cfg.dotGraph, "cnf/raw_graph") # TODO: make dot file in cnf form utility.generateDomSet(cfg) # print("Dominator set ended----------->\n\n") utility.generateSDomSet(cfg) # print("Strictly Dominator set ended ----------->\n\n") utility.generatIDom(cfg) # print("Immediate Dominator ended ----------->\n\n") utility.generateDFSet(cfg) utility.insertPhiNode(cfg) utility.initialiseVersinosedPhiNode(cfg) utility.versioniseVariable(cfg) utility.phiDestruction(cfg) ssaString = MySsaStringGenerator(cfg, parser) ssaString.execute() # utility.generateFinalDotGraph(cfg) # for nodeId in cfg.nodes: # cfg.nodes[nodeId].printPretty() # cfg.dotToPng(cfg.dotGraph, "cnf/raw_graph") # # hello1 = utility.generateBeforeVersioningDotFile(cfg) # cfg.dotToPng(hello1, "cnf/before_versioning_graph") # # hello4 = utility.generateDestructedPhiNodeWalaDotFile(cfg) # cfg.dotToPng(hello4, "cnf/destructed_phi_node_wala_graph") cnfUtility = CnfUtility(helper) iCnfCfg = cnfUtility.copyCfg(cfg) reverseCnfCfg = cnfUtility.topologicalSort(iCnfCfg) cnfUtility.unvisit(iCnfCfg) cnfUtility.setParentBranching(iCnfCfg) cnfCfg = cnfUtility.reverseDictOrder(reverseCnfCfg) cnfUtility.copyParentBranching(cnfCfg, iCnfCfg) # print("\n\n\n\n\n\t\t\tThe intermediate CNF form is ------------------------------>\n\n\n\n") # for nodeId in iCnfCfg.nodes: # iCnfCfg.nodes[nodeId].printPretty() # print("\n\n\n\n\n\t\t\tThe CNF form is ------------------------------>\n\n\n\n") cnfVcGenerator = CnfVcGenerator(cnfCfg, parser) cnfPath = [] for nodeId in cnfCfg.nodes: cnfPath.append(nodeId) cnfVcGenerator.generateCnfVc(cnfPath) # print("\n\n\n\n\t\t\tThe CNF VCs are : ------------------------------->\n\n\n") # print(cnfVcs) # for nodeId in cnfCfg.nodes: # cnfCfg.nodes[nodeId].printPretty() # cnfVc = cnfUtility.cnfVc(cnfCfg) # # print("\n\n\t\tThe CNF VCs are ----------------->\n\n\n") # # for str in cnfVc: # print(str) varSet, z3Str = cnfUtility.iZ3format(cnfCfg) # print("\n\n*******************\n\n", z3Str, "\n\n--------------\n\n") # print(varSet) # # print("\n\n") z3Str = z3Str.replace(" ", " ") z3Str = z3Str.replace(" == ", " = ") z3Str = z3Str.replace(" = ", " == ") print("\n**** Final CNF VC in Well_Bracketted_Format:\n\n", z3Str, "\n") z3StringConvertor = WpcStringConverter(z3Str) z3StringConvertor.execute() # print("\n**** Final CNF VC in Z3 Format:\n", z3StringConvertor.convertedWpc, "\n") z3FileString = "# This file was generated at runtime on " + str( datetime.datetime.now()) + "\n" z3FileString = z3FileString + "from z3 import *\n\n" z3FileString = z3FileString + "class Z3RuntimeCnfFile():\n" z3FileString = z3FileString + "\t" + "def __init__(self):\n" z3FileString = z3FileString + "\t\t" + "self.finalFormula = \"\"\n" z3FileString = z3FileString + "\t\t" + "self.satisfiability = \"\"\n" z3FileString = z3FileString + "\t\t" + "self.modelForViolation = \"\"\n\n" z3FileString = z3FileString + "\t" + "def execute(self):\n" for i in varSet: z3FileString = z3FileString + "\t\t" + i + " = Real(\'" + i + "\')\n" z3FileString = z3FileString + "\n\t\ts = Solver()\n" if len(z3StringConvertor.implies_p) > 0: for i in range(len(z3StringConvertor.implies_p)): z3FileString = z3FileString + "\t\t" + "s.add(" + z3StringConvertor.implies_p[ i] + ")\n" if not z3StringConvertor.convertedWpc == z3StringConvertor.implies_p_q[ i]: z3FileString = z3FileString + "\t\t" + "s.add(" + z3StringConvertor.implies_p_q[ i] + ")\n" # if z3StringConvertor.convertedWpc not in z3StringConvertor.implies_p_q: # z3FileString = z3FileString + "\t\t" + "s.add(" + z3StringConvertor.convertedWpc + ")\n" # else: # z3FileString = z3FileString + "\t\t" + "s.add(" + z3StringConvertor.convertedWpc + ")\n" z3FileString = z3FileString + "\t\t" + "s.add( Not( " + z3StringConvertor.convertedWpc + " ) )\n" # z3FileString = z3FileString + "\n\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t" + "print(\"%%%%%%%%%% Aggregate Formula %%%%%%%%%%\\n\", s)" z3FileString = z3FileString + "\n\t\t" + "self.finalFormula = str(s)" # z3FileString = z3FileString + "\n\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t" + "print(\"%%%%%%%%%% Satisfiability %%%%%%%%%%\")\n" z3FileString = z3FileString + "\n\t\t" + "self.satisfiability = str(s.check())" z3FileString = z3FileString + "\n\t\t" + "if self.satisfiability == \"sat\":" # z3FileString = z3FileString + "\n\t\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t\t" + "print(\"-------->> Violation Occurred...\")" z3FileString = z3FileString + "\n\t\t\t" + "self.satisfiability = \"violation\"" # z3FileString = z3FileString + "\n\t\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t\t" + "print(\"%%%%%%%%%% An Instance for which Violation Occurred %%%%%%%%%%\\n\", s.model())" z3FileString = z3FileString + "\n\t\t\t" + "self.modelForViolation = str(s.model())" z3FileString = z3FileString + "\n\t\t" + "elif self.satisfiability == \"unsat\":" # z3FileString = z3FileString + "\n\t\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t\t" + "print(\"-------->> NO Violation Detected so far...\")" z3FileString = z3FileString + "\n\t\t\t" + "self.satisfiability = \"sat\"" # z3FileString = z3FileString + "\n\t\t\t" + "print()" # z3FileString = z3FileString + "\n\t\t" + "print()\n" file = open('cnf/Z3RuntimeCnfFile.py', "w") file.write(z3FileString) file.close() import cnf.Z3RuntimeCnfFile from cnf.Z3RuntimeCnfFile import Z3RuntimeCnfFile # Reload after module's creation to avoid old module remain imported from disk...VVI... cnf.Z3RuntimeCnfFile = reload(cnf.Z3RuntimeCnfFile) z3Runtime = Z3RuntimeCnfFile() z3Runtime.execute() finishTime = datetime.datetime.now() timeDifference = (finishTime - startTime).total_seconds() return linesOfCode, timeDifference, z3StringConvertor.convertedWpc, z3Runtime.satisfiability, z3Runtime.modelForViolation
def main(argv): datafile = "se/data/" + argv[1] specfile = "se/spec/" + argv[2] # file = open(datafile, "r") # content = file.read().upper() # file.close() processor = PreProcessor(specfile, datafile) tableInfo, assumeConstraintList, assertConstraintList, resultString = processor.start( ) file = open('se/upper_input.sql', "w") file.write(resultString) file.close() input = FileStream('se/upper_input.sql') lexer = PlSqlLexer(input) stream = CommonTokenStream(lexer) parser = PlSqlParser(stream) tree = parser.sql_script() # ast = tree.toStringTree(recog=parser) # print(str(MyPlSqlVisitor(parser).getRuleName(tree))) # print("\n\n", signature(tree.toStringTree), "\n") cfg = MyCFG() helper = MyHelper(parser) helper.updateTableDict(tableInfo) utility = MyUtility(helper) v = MyVisitor(parser, cfg, utility) v.visit(tree) print("\n\t", v.rawCFG, "\n") # for key in v.cfg.nodes: # if v.cfg.nodes[key].ctx != None: # print(key, " --> ", v.cfg.nodes[key].ctx.getText()) res = MyRawCfgToGraph(v.rawCFG, cfg) res.execute() # cfg.printPretty() cfg.dotToPng(cfg.dotGraph, "se/raw_graph") utility.generateDomSet(cfg) # print("Dominator set ended----------->\n\n") utility.generateSDomSet(cfg) # print("Strictly Dominator set ended ----------->\n\n") utility.generatIDom(cfg) # print("Immediate Dominator ended ----------->\n\n") utility.generateDFSet(cfg) utility.insertPhiNode(cfg) utility.initialiseVersinosedPhiNode(cfg) utility.versioniseVariable(cfg) utility.phiDestruction(cfg) ssaString = MySsaStringGenerator(cfg, parser) ssaString.execute() for nodeId in cfg.nodes: cfg.nodes[nodeId].printPretty() hello1 = utility.generateBeforeVersioningDotFile(cfg) # print(hello1) cfg.dotToPng(hello1, "se/before_versioning_graph") hello2 = utility.generateVersionedDotFile(cfg) #print(hello2) cfg.dotToPng(hello2, "se/versioned_graph") hello3 = utility.generateVersionedPhiNodeWalaDotFile(cfg) #print(hello3) cfg.dotToPng(hello3, "se/versioned_phi_node_wala_graph") hello4 = utility.generateDestructedPhiNodeWalaDotFile(cfg) #print(hello4) cfg.dotToPng(hello4, "se/destructed_phi_node_wala_graph")