
On Thu, 5 Apr 2012, Philipp Klaus Krause wrote:
I have graph as follows:
struct cfg_node { iCode *ic; operand_map_t operands; std::set<var_t> alive; std::set<var_t> dying; };
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, cfg_node> cfg_t;
And a fragment of code:
wassertl (!boost::num_vertices(cfg), "CFG non-empty before creation."); for (ic = start_ic, i = 0, j = 0; ic; ic = ic->next, i++) { boost::add_vertex(cfg); wassertl (cfg[i].alive.empty(), "Alive set non-empty upon creation.");
Nothing inside the loop add or deletes vertices or changes the alive members.
The code works fine on Linux, but I got bug reports from Windows users. For them the assertion in the loop triggers (and an attempt to insert something into alive later segfaults).
Have you tried Valgrind on Linux?
So I have two questions:
What could be the cause of this problem? Has it been encountered before?
Are you sure ic is initialized correctly (pointing to other vertices in the graph)? Otherwise, I don't see a reason why your code wouldn't work.
Is the approach of using cfg[i] to get the vertex still correct? I've used this for some time, but I can't find it in current boost documentation.
Yes -- see <URL:http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/bundles.html>. -- Jeremiah Willcock