@@ -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