Source code for angr.analyses.decompiler.ailgraph_walker

import networkx  # pylint:disable=unused-import


[docs]class RemoveNodeNotice(Exception): pass
[docs]class AILGraphWalker: """ Walks an AIL graph and optionally replaces each node with a new node. """
[docs] def __init__(self, graph, handler, replace_nodes: bool = False): self.graph: networkx.DiGraph = graph self.handler = handler self._replace_nodes = replace_nodes
[docs] def walk(self): for node in list(self.graph.nodes()): try: r = self.handler(node) remove = False except RemoveNodeNotice: # we need to remove this node r = None remove = True if self._replace_nodes: if remove: self.graph.remove_node(node) elif r is not None and r is not node: in_edges = list(self.graph.in_edges(node, data=True)) out_edges = list(self.graph.out_edges(node, data=True)) self.graph.remove_node(node) self.graph.add_node(r) for src, _, data in in_edges: if src is node: self.graph.add_edge(r, r, **data) else: self.graph.add_edge(src, r, **data) for _, dst, data in out_edges: if dst is node: self.graph.add_edge(r, r, **data) else: self.graph.add_edge(r, dst, **data)