@@ -170,8 +170,8 @@ taint_propagation_chainst::taint_propagation_chainst(
170
170
}
171
171
// Build predecessors of nodes of chains.
172
172
for (const auto &elem : successors)
173
- for (const auto &fns_nid : elem.second )
174
- predecessors[fns_nid. second ].insert (elem.first );
173
+ for (const auto &nid_fns : elem.second )
174
+ predecessors[nid_fns. first ].insert (elem.first );
175
175
resolve_conditional_rule_applications (
176
176
program,
177
177
numbering,
@@ -242,7 +242,7 @@ taint_propagation_chainst::extend_chain_by_transition(
242
242
}
243
243
// Now we perform the the insertion of the transition to the new node and
244
244
// we consider the case of the target node being sink.
245
- const auto res=successors[nid].insert ({functions, dst_nid });
245
+ const auto res=successors[nid].insert ({dst_nid, functions });
246
246
const std::vector<taint_rule_idt> &to_sink_rules=
247
247
tokens_propagation_graph.get_backward_rules_from_token (
248
248
tokens_propagation_graph.get_sink_token ());
@@ -279,23 +279,31 @@ 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
- {
283
- auto &edges=successors.at (pred_nid);
284
- std::vector<successors_mapt::mapped_type::iterator> to_remove;
285
- for (auto it=edges.begin (); it!=edges.end (); ++it)
286
- if (it->second ==nodes.size ())
287
- to_remove.push_back (it);
288
- for (const auto &it : to_remove)
282
+ if (pred_nid!=nodes.size ())
289
283
{
290
- edges.insert ({it->first ,nid});
291
- edges.erase (it);
284
+ auto &edges=successors.at (pred_nid);
285
+ edges[nid].insert (edges[nodes.size ()].begin (), edges[nodes.size ()].end ());
286
+ edges.erase (nodes.size ());
292
287
}
293
- }
294
- for (const auto &fns_nid : get_successors_map ().at (nodes.size ()))
288
+ for (const auto &nid_fns : get_successors_map ().at (nodes.size ()))
289
+ if (nid_fns.first !=nodes.size ())
290
+ {
291
+ auto &edges=predecessors.at (nid_fns.first );
292
+ edges.insert (nid);
293
+ edges.erase (nodes.size ());
294
+ }
295
+ if (get_predecessors_map ().at (nodes.size ()).count (nodes.size ())!=0UL )
295
296
{
296
- auto &edges=predecessors.at (fns_nid.second );
297
- edges.insert (nid);
298
- edges.erase (nodes.size ());
297
+ {
298
+ auto &edges=successors.at (nodes.size ());
299
+ edges[nid].insert (edges[nodes.size ()].begin (), edges[nodes.size ()].end ());
300
+ edges.erase (nodes.size ());
301
+ }
302
+ {
303
+ auto &edges=predecessors.at (nodes.size ());
304
+ edges.insert (nid);
305
+ edges.erase (nodes.size ());
306
+ }
299
307
}
300
308
successors.at (nid)=successors.at (nodes.size ());
301
309
successors.erase (nodes.size ());
@@ -321,7 +329,7 @@ void taint_propagation_chainst::erase_dead_branches()
321
329
continue ;
322
330
fwd_reachable.insert (nid);
323
331
for (const auto &fns_nid : get_successors_map ().at (nid))
324
- work.push_back (fns_nid.second );
332
+ work.push_back (fns_nid.first );
325
333
}
326
334
}
327
335
// Use BFS to find all nodes backward-reachable from sinks.
@@ -448,13 +456,13 @@ std::ostream &to_dot(
448
456
for (const auto &nid : chains.get_sinks ())
449
457
ostr << " " << nid << " -> " << chains.get_nodes ().size ()+1U << " ;\n " ;
450
458
for (const auto &nid_edge : chains.get_successors_map ())
451
- for (const auto &elabel_dstnid : nid_edge.second )
459
+ for (const auto &dstnid_elabel : nid_edge.second )
452
460
{
453
- ostr << " " << nid_edge.first << " -> " << elabel_dstnid. second ;
461
+ ostr << " " << nid_edge.first << " -> " << dstnid_elabel. first ;
454
462
ostr << " [label=\" FUNCTIONS {" ;
455
- if (!elabel_dstnid. first .empty ())
463
+ if (!dstnid_elabel. second .empty ())
456
464
ostr << " \\ l" ;
457
- for (const auto &fid : elabel_dstnid. first )
465
+ for (const auto &fid : dstnid_elabel. second )
458
466
ostr << " " << fid << " \\ l" ;
459
467
ostr << " }\\ l\" ];\n " ;
460
468
}
0 commit comments