]> granicus.if.org Git - graphviz/commitdiff
sparse: fix: avoid a use of 'itos'
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Tue, 26 Apr 2022 05:05:18 +0000 (22:05 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 28 Apr 2022 03:19:16 +0000 (20:19 -0700)
Usage of `itos` in this way relies on lifetime extension of a struct member in
an rvalue. While these semantics exist in C11 and C++, they do not in C99. As a
result, this causes undefined behavior.

This commit effectively reverts 10638c445d1f12bb3fcd0c45946ec8a2e3af60af.

Gitlab: #2229

lib/sparse/DotIO.c

index 284586013e81391e5ae7debb38d839db3e73e3b1..34ec9535b7df747c6fea4dc058502f7811dfde36 100644 (file)
@@ -695,7 +695,9 @@ void attached_clustering(Agraph_t* g, int maxcluster, int clustering_scheme){
     for (i = 0; i < nnodes; i++) (clusters)[i]++;/* make into 1 based */
     for (n = agfstnode (g); n; n = agnxtnode (g, n)) {
       i = ND_id(n);
-      agxset(n, clust_sym, itos((clusters)[i]).str);
+      char value_buffer[CHARS_FOR_NUL_TERM_INT];
+      snprintf(value_buffer, sizeof(value_buffer), "%d", clusters[i]);
+      agxset(n, clust_sym, value_buffer);
     }
     if (Verbose){
       fprintf(stderr," no complement clustering info in dot file, using modularity clustering. Modularity = %f, ncluster=%d\n",modularity, nc);