$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Paolo Fosser (pfosser_at_[hidden])
Date: 2002-05-30 01:07:53
Please let me know something (it's your fault, it's not a bug | we are
having a look | we haven't got the time to verify | ...)
Sorry to be a pain in the neck,
Paolo
Paolo Fosser wrote:
> 
> Hi to everybody,
>    first of all I beg pardon if my English isn't much good: I'm Italian!
> 
> I'm working with gcc 3.0.1 on a Linux Mandrake sys with kernel 2.4.8.
> The problem I'm having is that the second call of read_graphviz() in the
> same program causes a Segmentation fault.
> 
> Hoping it will be useful in order to spot the trouble, I did some
> "debugging" on yyparse() from file graphviz_graph_parser.cpp.
> 
> I found out that the Segmentation fault is caused by the line commented
> with // <<<< in the following code snippet
> 
> <code>
> 
> case 29:
> #line 318 "graphviz_parser.y"
> {
>     graphviz::Vertex* temp   =
> static_cast<graphviz::Vertex*>(yyvsp[-1].ptr);
> 
>     graphviz::current_vertex = *temp;
> 
> graphviz::set_attribute(*static_cast<GRAPHVIZ_GRAPH*>(YYPARSE_PARAM),
>                             NODE_A);       // <<<<
>     delete temp;
>     yyval.i = 0;
>   ;
>     break;}
> 
> </code>
> 
> Having a look at (and tampering with) graphviz::set_attribute()
> 
> <code>
> 
> static void set_attribute(Subgraph& g,
>                           AttrState s, bool clear_attribute = true) {
> 
>   typedef Subgraph Graph;
>   switch ( s ) {
> // ...
>       case NODE_A:
>         {
>           boost::property_map<Graph, boost::vertex_attribute_t>::type
>             va = boost::get(boost::vertex_attribute, g);    //va[v]
>           set_attribute(va[current_vertex], attributes);
>         }
>         break;
> // ...
> 
> }
> 
> </code>
> 
> I isolated the access violation in the call to (a different)
> graphviz::set_attribute()
> 
> <code>
>     static void set_attribute(GraphvizAttrList& p,
>                               const GraphvizAttrList& attr) {
>       GraphvizAttrList::const_iterator i, end;
>       for ( i=attr.begin(), end=attr.end(); i!=end; ++i)
>         p[i->first]=i->second;
>     }
> </code>
> 
> More precisely, execution breaks down at the first
> p[i->first]=i->second; . I checked attr and its content is correct.
> Hence the problem seems to be p, that is va[current_vertex], that is the
> content of the location pointed to by yyvsp[-1].ptr (see first snippet).
> 
> I hope my analisys was correct.
> 
> I'd like to point out that my code calls read_graphviz() two times on
> the same graph. The first time all is OK, while the second call causes
> the segmentation fault.
> 
> Many thanks to anyone who will spend their time in helping me. This is
> important to me because I'm using the library for my thesis.
> 
> Cheers,
> Paolo