Skip to content

Commit 31ea133

Browse files
committed
APP:CG: add checks for existence of nodes
1 parent ca5c304 commit 31ea133

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

chb/app/Callgraph.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -243,13 +243,14 @@ def clone(self, reverse: bool = False) -> "Callgraph":
243243
for n in self.nodes.values():
244244
result.add_node(n)
245245
for (src, dsts) in self.edges.items():
246-
srcnode = self.nodes[src]
247-
for dst in dsts:
248-
dstnode = self.nodes[dst]
249-
if reverse:
250-
result.add_edge(dstnode, srcnode)
251-
else:
252-
result.add_edge(srcnode, dstnode)
246+
if src in self.nodes:
247+
srcnode = self.nodes[src]
248+
for dst in dsts:
249+
dstnode = self.nodes[dst]
250+
if reverse:
251+
result.add_edge(dstnode, srcnode)
252+
else:
253+
result.add_edge(srcnode, dstnode)
253254
return result
254255

255256
@property
@@ -275,7 +276,10 @@ def add_node(self, node: CallgraphNode) -> None:
275276
self._nodes[node.name] = node
276277
# In some binaries, we may first see a stub for a user function
277278
# (represented as a library node) and then see the user function itself.
278-
elif node.is_app_node and self._nodes[node.name].is_lib_node:
279+
elif (
280+
node.is_app_node
281+
and node.name in self._nodes
282+
and self._nodes[node.name].is_lib_node):
279283
self._nodes[node.name] = node
280284
else:
281285
pass
@@ -340,20 +344,22 @@ def is_source(node: CallgraphNode) -> bool:
340344
for (src, dsts) in self.edges.items():
341345
for dst in dsts:
342346
if (
343-
result.has_node(self.nodes[src])
347+
src in self.nodes
348+
and result.has_node(self.nodes[src])
344349
and not result.has_edge(src, dst)):
345350
result.add_edge(self.nodes[src], self.nodes[dst])
346351
edgesadded = True
347352

348353
while edgesadded:
349354
edgesadded = False
350355
for (src, dsts) in self.edges.items():
351-
if not result.has_node(self.nodes[src]):
356+
if src in self.nodes and not result.has_node(self.nodes[src]):
352357
continue
353358
for dst in dsts:
354359
if not result.has_edge(src, dst):
355-
result.add_edge(self.nodes[src], self.nodes[dst])
356-
edgesadded = True
360+
if src in self.nodes:
361+
result.add_edge(self.nodes[src], self.nodes[dst])
362+
edgesadded = True
357363
return result
358364

359365
def constrain_sinks(self, sinks: List[str]) -> "Callgraph":

0 commit comments

Comments
 (0)