about summary refs log tree commit diff stats
path: root/miasm2/core
diff options
context:
space:
mode:
authorCamille Mougey <commial@gmail.com>2016-03-23 20:58:13 +0100
committerCamille Mougey <commial@gmail.com>2016-03-23 20:58:13 +0100
commit4eceb2b2e723409b610533788c0b98ec23a9e204 (patch)
treeda1c97447b429eba2d732a4f2719f5e9107444e6 /miasm2/core
parent1eec0a14818adc697c9f3955b958dda67f93e054 (diff)
parent8c436da764b0616976c74c43fefd5494d3889ebb (diff)
downloadmiasm-4eceb2b2e723409b610533788c0b98ec23a9e204.tar.gz
miasm-4eceb2b2e723409b610533788c0b98ec23a9e204.zip
Merge pull request #347 from serpilliere/dg_has_loop
Dg has loop
Diffstat (limited to 'miasm2/core')
-rw-r--r--miasm2/core/graph.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/miasm2/core/graph.py b/miasm2/core/graph.py
index c98bf8a9..d97ca8be 100644
--- a/miasm2/core/graph.py
+++ b/miasm2/core/graph.py
@@ -478,6 +478,34 @@ class DiGraph(object):
         """Performs a depth first search on the reversed graph from @head"""
         return self._walk_generic_first(head, -1, self.predecessors_iter)
 
+    def has_loop(self):
+        """Return True if the graph contains at least a cycle"""
+        todo = list(self.nodes())
+        # tested nodes
+        done = set()
+        # current DFS nodes
+        current = set()
+        while todo:
+            node = todo.pop()
+            if node in done:
+                continue
+
+            if node in current:
+                # DFS branch end
+                for succ in self.successors_iter(node):
+                    if succ in current:
+                        return True
+                # A node cannot be in current AND in done
+                current.remove(node)
+                done.add(node)
+            else:
+                # Launch DFS from node
+                todo.append(node)
+                current.add(node)
+                todo += self.successors(node)
+
+        return False
+
     def compute_natural_loops(self, head):
         """
         Computes all natural loops in the graph.