def test_inverse_graph(): g = DiGraph() n1 = DiGraph.make_node(data='n1') n2 = DiGraph.make_node(data='n2') n3 = DiGraph.make_node(data='n3') n4 = DiGraph.make_node(data='n4') e12 = DiGraph.make_edge(source=n1, dest=n2) e13 = DiGraph.make_edge(source=n1, dest=n3) e14 = DiGraph.make_edge(source=n1, dest=n4) e24 = DiGraph.make_edge(source=n2, dest=n4) e34 = DiGraph.make_edge(source=n3, dest=n4) g.add_edge(e12) g.add_edge(e13) g.add_edge(e14) g.add_edge(e24) g.add_edge(e34) g.freeze() logger.debug("Normal graph :=\n%s", g.to_dot()) inv_g = g.inverse() logger.debug("Inverse graph :=\n%s", inv_g.to_dot()) # Check equality of nodes in both graphs for g_node in g.nodes: has_equal = False for inv_node in inv_g.nodes: if g_node == inv_node: has_equal = True break assert has_equal
def test_conditions(): logger.debug("test_conditions") co_simple = get_co(CONDITION_CASE) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) for decl in bytecode_object.declarations: cflow = ControlFlow(decl) cflow.block_constraints
def test_bz_1_reproducer(): co_simple = get_co(REDUCED_TC) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) for decl in bytecode_object.declarations: cflow = ControlFlow(decl) assert len(cflow.graph.roots()) == 1 logger.debug("cflow := \n%s", cflow.graph.to_dot()) doms = cflow.dominators
def test_bz_1_reproducer(): co_simple = get_co(REDUCED_TC) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) for decl in bytecode_object.declarations: cflow = ControlFlow(decl) assert len(cflow.graph.roots()) == 1 logger.debug("cflow := \n%s", cflow.graph.to_dot()) doms = cflow.dominators
def test_loop_breaks(): logger.debug("test_loop_breaks") co_simple = get_co(LOOP_BREAK_CASE) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) assert len(bytecode_object.declarations) == 2 for decl in bytecode_object.declarations: cflow = ControlFlow(decl) assert cflow.blocks is not None assert len(cflow.dominators.dom) > 0
def test_list_comprehension(): logger.debug("test_list_comprehension") co_simple = get_co(LIST_COMP_CASE) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) for decl in bytecode_object.declarations: cflow = ControlFlow(decl) for block in cflow.blocks: for stmt in block.statements: if stmt.native is not None: logger.debug("%s", stmt)
def test_constraint_equivalence(): logger.debug("test_conditions") co_simple = get_co(CONSTRAINT_EQ_CASE) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) for decl in bytecode_object.declarations: cflow = ControlFlow(decl) all_constraints = list() for block in cflow.block_constraints: logger.debug("Cstr: %s", cflow.block_constraints[block].tree) all_constraints.append(cflow.block_constraints[block].tree) for cstr1, cstr2 in get_pairs(all_constraints): assert cstr1 == cstr2
def test_ast(): co_simple = get_co(SIMPLE_PROGRAM) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) assert len(bytecode_object.declarations) == 10 for decl in bytecode_object.declarations: cflow = ControlFlow(decl) assert cflow.blocks is not None for block in cflow.blocks: for stmt in block.statements: if stmt.native is not None: logger.debug("%s", stmt) logger.debug("%s", dump(stmt.native))
def test_cflow1(): co_simple = get_co(SIMPLE_PROGRAM) assert co_simple is not None bytecode_object = BytecodeObject('<string>') bytecode_object.parse_code(co_simple) assert len(bytecode_object.declarations) == 11 for decl in bytecode_object.declarations: cflow = ControlFlow(decl) assert cflow.blocks is not None assert len(cflow.graph.roots()) == 1 assert len(cflow.dominators.dom) > 0 cflow.block_constraints is not None for block in cflow.block_constraints: cstr = cflow.block_constraints[block] assert cstr.tree is not None logger.debug("Constraint: %s", cstr) cdg = cflow.control_dependence
def test_inverse_graph(): g = DiGraph() n1 = DiGraph.make_node(data='n1') n2 = DiGraph.make_node(data='n2') n3 = DiGraph.make_node(data='n3') n4 = DiGraph.make_node(data='n4') e12 = DiGraph.make_edge(source=n1, dest=n2) e13 = DiGraph.make_edge(source=n1, dest=n3) e14 = DiGraph.make_edge(source=n1, dest=n4) e24 = DiGraph.make_edge(source=n2, dest=n4) e34 = DiGraph.make_edge(source=n3, dest=n4) g.add_edge(e12) g.add_edge(e13) g.add_edge(e14) g.add_edge(e24) g.add_edge(e34) logger.debug("Normal graph :=\n%s", g.to_dot()) inv_g = g.inverse() logger.debug("Inverse graph :=\n%s", inv_g.to_dot())
def test_walker(): g = DiGraph() n1 = DiGraph.make_node(data='n1') n2 = DiGraph.make_node(data='n2') n3 = DiGraph.make_node(data='n3') n4 = DiGraph.make_node(data='n4') n5 = DiGraph.make_node(data='n5') n6 = DiGraph.make_node(data='n6') e12 = DiGraph.make_edge(source=n1, dest=n2) e13 = DiGraph.make_edge(source=n1, dest=n3) e14 = DiGraph.make_edge(source=n1, dest=n4) e24 = DiGraph.make_edge(source=n2, dest=n4) e34 = DiGraph.make_edge(source=n3, dest=n4) e45 = DiGraph.make_edge(source=n4, dest=n5) e56 = DiGraph.make_edge(source=n5, dest=n6) e61 = DiGraph.make_edge(source=n6, dest=n1) # add cycle g.add_edge(e12) g.add_edge(e13) g.add_edge(e14) g.add_edge(e24) g.add_edge(e34) g.add_edge(e45) g.add_edge(e56) g.add_edge(e61) class EdgePrinterVisitor(EdgeVisitor): def __init__(self): EdgeVisitor.__init__(self) self.edges = [] def visit(self, edge): self.edges.append(edge) visitor = EdgePrinterVisitor() walker = Walker(g, visitor) walker.traverse(n1) logger.debug("Post-order DFS: %s", dfs_postorder_nodes(g, n1)) assert len(visitor.edges) == 8 logger.debug("\n" + g.to_dot()) s = DiGraph() n1 = s.make_add_node(data='n1') n2 = s.make_add_node(data='n2') n3 = s.make_add_node(data='n3') e12 = s.make_add_edge(n1, n2) e23 = s.make_add_edge(n2, n3) logger.debug("Post-order DFS: %s", dfs_postorder_nodes(s, n1))
def visit(self, block): logger.debug("Visiting block: %s", block) logger.debug('\n' + show_bytecode(block.bytecode))
def new_control_flow(self): logger.debug("Received new CFG: %s", self.control_flow)
def visit(self, block): logger.debug("Visiting block: %s", block) logger.debug('\n' + show_bytecode(block.bytecode))
def new_control_flow(self): logger.debug("Received new CFG: %s", self.control_flow)