Boost logo

Boost Users :

Subject: Re: [Boost-users] [graph] Problem with vertex initialization in boost::add_vertex()
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2012-04-05 10:06:39


On Thu, 5 Apr 2012, Philipp Klaus Krause wrote:

> On 05.04.2012 15:16, Jeremiah Willcock wrote:
>> 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.
>
> To me it seems as if the default constructor of alive is not called upon
> add_vertex(), resulting in alive being uninitialized memory (same for
> dying).

Could you please add a hand-written default constructor that prints
something out to be sure of that?

-- Jeremiah Willcock


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net