示例#1
0
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
示例#2
0
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
示例#3
0
文件: test_bz_1.py 项目: neuroo/equip
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
示例#4
0
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
示例#5
0
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
示例#6
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)
示例#7
0
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
示例#8
0
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))
示例#9
0
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
示例#10
0
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())
示例#11
0
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))
示例#12
0
 def visit(self, block):
   logger.debug("Visiting block: %s", block)
   logger.debug('\n' + show_bytecode(block.bytecode))
示例#13
0
 def new_control_flow(self):
   logger.debug("Received new CFG: %s", self.control_flow)
示例#14
0
 def visit(self, block):
     logger.debug("Visiting block: %s", block)
     logger.debug('\n' + show_bytecode(block.bytecode))
示例#15
0
 def new_control_flow(self):
     logger.debug("Received new CFG: %s", self.control_flow)