@@ -279,19 +279,29 @@ taint_propagation_chainst::erase_node(const node_idt nid)
279
279
}
280
280
281
281
for (const auto &pred_nid : get_predecessors_map ().at (nodes.size ()))
282
- if (pred_nid!=nodes.size ())
282
+ if (pred_nid!=nodes.size ()) // We have to exclude here the situation, when
283
+ // the node 'nodes.size()' (i.e. the one
284
+ // replacing the removed node 'nid') is its own
285
+ // predecessor. We handle that situation later.
283
286
{
284
287
auto &edges=successors.at (pred_nid);
285
288
edges[nid].insert (edges[nodes.size ()].begin (), edges[nodes.size ()].end ());
286
289
edges.erase (nodes.size ());
287
290
}
288
291
for (const auto &nid_fns : get_successors_map ().at (nodes.size ()))
289
- if (nid_fns.first !=nodes.size ())
292
+ if (nid_fns.first !=nodes.size ()) // We have to exclude here the situation,
293
+ // when the node 'nodes.size()' (i.e. the
294
+ // one replacing the removed node 'nid')
295
+ // is its own predecessor. We handle that
296
+ // situation later.
290
297
{
291
298
auto &edges=predecessors.at (nid_fns.first );
292
299
edges.insert (nid);
293
300
edges.erase (nodes.size ());
294
301
}
302
+ // Here we handle the situation, when the node 'nodes.size()' (i.e. the one
303
+ // replacing the removed node 'nid') is its own predecessor and successor
304
+ // (i.e. when this node has a loop edge).
295
305
if (get_predecessors_map ().at (nodes.size ()).count (nodes.size ())!=0UL )
296
306
{
297
307
{
@@ -305,6 +315,9 @@ taint_propagation_chainst::erase_node(const node_idt nid)
305
315
edges.erase (nodes.size ());
306
316
}
307
317
}
318
+ // Now we finally remove in- and out-edges of the node 'nid' (by replacing
319
+ // them by the last node 'nodes.size()', which will become the new node
320
+ // 'nid').
308
321
successors.at (nid)=successors.at (nodes.size ());
309
322
successors.erase (nodes.size ());
310
323
predecessors.at (nid)=predecessors.at (nodes.size ());
0 commit comments