]> granicus.if.org Git - graphviz/commitdiff
graphviz-aliasing-fixes.patch backported from SuSE graphviz-2.18
authorellson <devnull@localhost>
Wed, 23 Apr 2008 18:21:41 +0000 (18:21 +0000)
committerellson <devnull@localhost>
Wed, 23 Apr 2008 18:21:41 +0000 (18:21 +0000)
lib/agraph/edge.c
lib/agraph/flatten.c

index 8b1573f62755f2e16ab3c08fb30da2f7b1792896..c093e5afa65988825a64e4b0d1033f4fbcf1a2a3 100644 (file)
@@ -149,28 +149,29 @@ static Agedge_t *agfindedge_by_id(Agnode_t * t, Agnode_t * h,
 
 void agedgesetop(Agraph_t * g, Agedge_t * e, int ins)
 {
-    Dtlink_t **seq_set, **id_set;
+    union {
+       Dtlink_t **dtlink;
+       Agedge_t **agedge;
+    } seq_set;
+    Dtlink_t **id_set;
     Agnode_t *n;               /* node where <e> is referenced */
-    Agedge_t **tmp;            
 
     if (AGTYPE(e) == AGOUTEDGE) {
        n = AGOUT2IN(e)->node;
-       tmp = &(n->out); /* avoiding - "dereferencing type-punned pointer will break strict-aliasing rules" */
-       seq_set = (Dtlink_t **)tmp;
+       seq_set.agedge = &(n->out);
        id_set = &(n->outid);
     } else {
        n = AGIN2OUT(e)->node;
-       tmp = &(n->in);  
-       seq_set = (Dtlink_t **)tmp;
+       seq_set.agedge = &(n->in);
        id_set = &(n->inid);
     }
 
-    dtrestore(g->e_seq, *seq_set);
+    dtrestore(g->e_seq, *seq_set.dtlink);
     if (ins)
        dtinsert(g->e_seq, e);
     else
        dtdelete(g->e_seq, e);
-    *seq_set = dtextract(g->e_seq);
+    *seq_set.dtlink = dtextract(g->e_seq);
 
     dtrestore(g->e_id, *id_set);
     if (ins)
index e8ddbe904d602808bfbb76259425f6a22db85a03..98e3b1f6791154001373529eecf1882987d83117 100644 (file)
@@ -26,13 +26,17 @@ void agflatten_elist(Dict_t * d, Dtlink_t ** lptr)
 
 void agflatten_edges(Agraph_t * g, Agnode_t * n)
 {
-    Agedge_t **tmp;
 
-    tmp = &(n->out); /* avoiding - "dereferencing type-punned pointer will break strict-aliasing rules" */
+    union {
+       Dtlink_t **dtlink;
+       Agedge_t **agedge;
+       } out, in;
+
+    out.agedge = & (n->out);
+    in.agedge = & (n->in);
+    agflatten_elist(g->e_seq, out.dtlink);
+    agflatten_elist(g->e_seq, in.dtlink);
 
-    agflatten_elist(g->e_seq, (Dtlink_t **) tmp);
-    tmp = &(n->in);
-    agflatten_elist(g->e_seq, (Dtlink_t **) tmp);
 }
 
 void agflatten(Agraph_t * g, int flag)