Boost logo

Boost Users :

Subject: Re: [Boost-users] [graph] Problem with vertex initialization in boost::add_vertex()
From: Philipp Klaus Krause (pkk_at_[hidden])
Date: 2012-04-05 09:58:54


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).

Philipp

P.S.: var_t is a typedef for short.


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