This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][BZ #15160] Fix FPE in memusagestat when malloc utilizationis zero


Hi,

As described in bug #15160, memusagestat can crash with a FPE when the
program it profiles does not use any dynamically allocated memory.
The reproducer in the bz demonstrates this.

Attached patch fixes this crash by ensuring that nothing is plotted in
the output graph if the peak utilization for either the heap or stack
is 0, thus preventing this crash and also showing the correct plot.
Not regressions reported due to this change.  OK to commit?

Siddhesh

	* malloc/memusagestat.c (main): Draw graphs for heap and stack
	only if MAXSIZE_HEAP and MAXSIZE_STACK are non-zero.


diff --git a/malloc/memusagestat.c b/malloc/memusagestat.c
index f561e0d..7bbd009 100644
--- a/malloc/memusagestat.c
+++ b/malloc/memusagestat.c
@@ -319,17 +319,26 @@ main (int argc, char *argv[])
 
   for (line = 1; line <= 3; ++line)
     {
-      cnt = ((ysize - 40) * (maxsize_heap / 4 * line / heap_scale)) /
-	(maxsize_heap / heap_scale);
-      gdImageDashedLine (im_out, 40, ysize - 20 - cnt, xsize - 40,
-			 ysize - 20 - cnt, red);
-      snprintf (buf, sizeof (buf), heap_format, maxsize_heap / 4 * line /
-		heap_scale);
-      gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6,
-		     ysize - 26 - cnt, (unsigned char *) buf, red);
-
-      cnt2 = ((ysize - 40) * (maxsize_stack / 4 * line / stack_scale)) /
-	(maxsize_stack / stack_scale);
+      if (maxsize_heap > 0)
+	{
+	  cnt = (((ysize - 40) * (maxsize_heap / 4 * line / heap_scale))
+		 / (maxsize_heap / heap_scale));
+	  gdImageDashedLine (im_out, 40, ysize - 20 - cnt, xsize - 40,
+			     ysize - 20 - cnt, red);
+	  snprintf (buf, sizeof (buf), heap_format,
+		    maxsize_heap / 4 * line / heap_scale);
+	  gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6,
+			 ysize - 26 - cnt, (unsigned char *) buf, red);
+	}
+      else
+	cnt = 0;
+
+      if (maxsize_stack > 0)
+	cnt2 = (((ysize - 40) * (maxsize_stack / 4 * line / stack_scale))
+		/ (maxsize_stack / stack_scale));
+      else
+	cnt2 = 0;
+
       if (cnt != cnt2)
 	gdImageDashedLine (im_out, 40, ysize - 20 - cnt2, xsize - 40,
 			   ysize - 20 - cnt2, green);
@@ -372,7 +381,7 @@ main (int argc, char *argv[])
 				    ysize - 14, yellow);
 	  previously = now;
 
-	  if (also_total)
+	  if (also_total && maxsize_heap > 0)
 	    {
 	      size_t new3;
 
@@ -386,21 +395,27 @@ main (int argc, char *argv[])
 	      last_total = new3;
 	    }
 
-	  // assert (entry.heap <= maxsize_heap);
-	  new[0] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
-				    * entry.heap) / maxsize_heap);
-	  gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
-		       last_heap, 40 + ((xsize - 80) * cnt) / total, new[0],
-		       red);
-	  last_heap = new[0];
-
-	  // assert (entry.stack <= maxsize_stack);
-	  new[1] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
-				    * entry.stack) / maxsize_stack);
-	  gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
-		       last_stack, 40 + ((xsize - 80) * cnt) / total, new[1],
-		       green);
-	  last_stack = new[1];
+	  if (maxsize_heap > 0)
+	    {
+	      new[0] = ((ysize - 20)
+			- ((((unsigned long long int) (ysize - 40))
+			    * entry.heap) / maxsize_heap));
+	      gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
+			   last_heap, 40 + ((xsize - 80) * cnt) / total,
+			   new[0], red);
+	      last_heap = new[0];
+	    }
+
+	  if (maxsize_stack > 0)
+	    {
+	      new[1] = ((ysize - 20)
+			- ((((unsigned long long int) (ysize - 40))
+			    * entry.stack) / maxsize_stack));
+	      gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
+			   last_stack, 40 + ((xsize - 80) * cnt) / total,
+			   new[1], green);
+	      last_stack = new[1];
+	    }
 	}
 
       cnt = 0;
@@ -448,7 +463,7 @@ main (int argc, char *argv[])
 	      next_tick += MAX (1, total / 20);
 	    }
 
-	  if (also_total)
+	  if (also_total && maxsize_heap > 0)
 	    {
 	      size_t new3;
 
@@ -459,16 +474,24 @@ main (int argc, char *argv[])
 	      last_total = new3;
 	    }
 
-	  new[0] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
-				    * entry.heap) / maxsize_heap);
-	  gdImageLine (im_out, last_xpos, last_heap, xpos, new[0], red);
-	  last_heap = new[0];
+	  if (maxsize_heap > 0)
+	    {
+	      new[0] = ((ysize - 20)
+			- ((((unsigned long long int) (ysize - 40))
+			    * entry.heap) / maxsize_heap));
+	      gdImageLine (im_out, last_xpos, last_heap, xpos, new[0], red);
+	      last_heap = new[0];
+	    }
 
-	  // assert (entry.stack <= maxsize_stack);
-	  new[1] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
-				    * entry.stack) / maxsize_stack);
-	  gdImageLine (im_out, last_xpos, last_stack, xpos, new[1], green);
-	  last_stack = new[1];
+	  if (maxsize_stack > 0)
+	    {
+	      new[1] = ((ysize - 20)
+			- ((((unsigned long long int) (ysize - 40))
+			    * entry.stack) / maxsize_stack));
+	      gdImageLine (im_out, last_xpos, last_stack, xpos, new[1],
+			   green);
+	      last_stack = new[1];
+	    }
 
 	  last_xpos = xpos;
 	}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]