]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
When truncating long lines in the output file, make sure they end with a
authorNicholas Nethercote <njn@valgrind.org>
Sun, 20 Jan 2008 23:30:30 +0000 (23:30 +0000)
committerNicholas Nethercote <njn@valgrind.org>
Sun, 20 Jan 2008 23:30:30 +0000 (23:30 +0000)
newline.  Fixes bug #155929.

MERGED FROM TRUNK (r7355)

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_3_BRANCH@7356

massif/ms_main.c
massif/tests/Makefile.am
massif/tests/long-names.c [new file with mode: 0644]
massif/tests/long-names.post.exp [new file with mode: 0644]
massif/tests/long-names.stderr.exp [new file with mode: 0644]
massif/tests/long-names.vgtest [new file with mode: 0644]

index 60863196573f045fb676915d3a7b150199aef709..67f67e769e71cc8254bdecf6881072d5c7d6952c 100644 (file)
@@ -774,6 +774,11 @@ static void sanity_check_SXTree(SXPt* sxpt)
 #define MAX_OVERESTIMATE   50
 #define MAX_IPS            (MAX_DEPTH + MAX_OVERESTIMATE)
 
+// This is used for various buffers which can hold function names/IP
+// description.  Some C++ names can get really long so 1024 isn't big
+// enough.
+#define BUF_LEN   2048
+
 // Get the stack trace for an XCon, filtering out uninteresting entries:
 // alloc-fns and entries above alloc-fns, and entries below main-or-below-main.
 //   Eg:       alloc-fn1 / alloc-fn2 / a / b / main / (below main) / c
@@ -783,7 +788,6 @@ static void sanity_check_SXTree(SXPt* sxpt)
 static
 Int get_IPs( ThreadId tid, Bool is_custom_alloc, Addr ips[])
 {
-   #define BUF_LEN   1024
    Char buf[BUF_LEN];
    Int n_ips, i, n_alloc_fns_removed;
    Int overestimate;
@@ -1863,13 +1867,25 @@ IRSB* ms_instrument ( VgCallbackClosure* closure,
 // The output file name.  Controlled by --massif-out-file.
 static Char* massif_out_file = NULL;
 
-#define FP_BUF_SIZE     1024
-Char FP_buf[FP_BUF_SIZE];
+Char FP_buf[BUF_LEN];
 
 // XXX: implement f{,n}printf in m_libcprint.c eventually, and use it here.
 // Then change Cachegrind to use it too.
 #define FP(format, args...) ({ \
-   VG_(snprintf)(FP_buf, FP_BUF_SIZE, format, ##args); \
+   VG_(snprintf)(FP_buf, BUF_LEN, format, ##args); \
+   FP_buf[BUF_LEN-1] = '\0';  /* Make sure the string is terminated. */ \
+   VG_(write)(fd, (void*)FP_buf, VG_(strlen)(FP_buf)); \
+})
+
+// Same as FP, but guarantees a '\n' at the end.  (At one point we were
+// truncating without adding the '\n', which caused bug #155929.)
+#define FPn(format, args...) ({ \
+   VG_(snprintf)(FP_buf, BUF_LEN, format, ##args); \
+   FP_buf[BUF_LEN-5] = '.';   /* "..." at the end make the truncation */ \
+   FP_buf[BUF_LEN-4] = '.';   /*  more obvious */ \
+   FP_buf[BUF_LEN-3] = '.'; \
+   FP_buf[BUF_LEN-2] = '\n';  /* Make sure the last char is a newline. */ \
+   FP_buf[BUF_LEN-1] = '\0';  /* Make sure the string is terminated. */ \
    VG_(write)(fd, (void*)FP_buf, VG_(strlen)(FP_buf)); \
 })
 
@@ -1892,7 +1908,6 @@ static void pp_snapshot_SXPt(Int fd, SXPt* sxpt, Int depth, Char* depth_str,
                             Int depth_str_len,
                             SizeT snapshot_heap_szB, SizeT snapshot_total_szB)
 {
-   #define BUF_LEN   1024
    Int   i, n_insig_children_sxpts;
    Char* perc;
    Char  ip_desc_array[BUF_LEN];
@@ -1925,7 +1940,10 @@ static void pp_snapshot_SXPt(Int fd, SXPt* sxpt, Int depth, Char* depth_str,
          ip_desc = VG_(describe_IP)(sxpt->Sig.ip-1, ip_desc, BUF_LEN);
       }
       perc = make_perc(sxpt->szB, snapshot_total_szB);
-      FP("%sn%d: %lu %s\n",
+      // Nb: we deliberately use 'FPn', not 'FP'.  So if the ip_desc is
+      // too long (eg. due to a long C++ function name), it'll get
+      // truncated, but the '\n' is still there so its a valid file.
+      FPn("%sn%d: %lu %s\n",     
          depth_str, sxpt->Sig.n_children, sxpt->szB, ip_desc);
 
       // Indent.
index 97802683b930c8f7015a37028d74214fdf7dce7b..fd5a01db0dc42ca26881693082f6cb54269d8361 100644 (file)
@@ -19,6 +19,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
         culling2.stderr.exp culling2.vgtest \
        custom_alloc.post.exp custom_alloc.stderr.exp custom_alloc.vgtest
        ignoring.post.exp ignoring.stderr.exp ignoring.vgtest \
+       long-names.post.exp long-names.stderr.exp long-names.vgtest \
        long-time.post.exp long-time.stderr.exp long-time.vgtest \
        new-cpp.post.exp new-cpp.stderr.exp new-cpp.vgtest \
        no-stack-no-heap.post.exp no-stack-no-heap.stderr.exp no-stack-no-heap.vgtest \
@@ -54,6 +55,7 @@ check_PROGRAMS = \
        deep \
        ignoring \
        insig \
+       long-names \
        long-time \
        new-cpp \
        null \
diff --git a/massif/tests/long-names.c b/massif/tests/long-names.c
new file mode 100644 (file)
index 0000000..260d250
--- /dev/null
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+// This function name is long enough to get truncated.
+
+#define A2500 \
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij\
+abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghij
+
+void A2500(int n)
+{
+   if (n > 0) {
+      malloc(1000);
+      A2500(n-1);
+   }
+}
+
+int main(void)
+{
+   A2500(3);
+   return 0;
+}
+
diff --git a/massif/tests/long-names.post.exp b/massif/tests/long-names.post.exp
new file mode 100644 (file)
index 0000000..4ed2155
--- /dev/null
@@ -0,0 +1,51 @@
+--------------------------------------------------------------------------------
+Command:            ./long-names
+Massif arguments:   --stacks=no --time-unit=B --heap-admin=0 --massif-out-file=massif.out --detailed-freq=3
+ms_print arguments: massif.out
+--------------------------------------------------------------------------------
+
+
+    KB
+2.930^                                                                       :
+     |                                                                       :
+     |                                                                       :
+     |                                                                       :
+     |                                                                       :
+     |                                                                       :
+     |                                                                       :
+     |                                                @                      :
+     |                                                @                      :
+     |                                                @                      :
+     |                                                @                      :
+     |                                                @                      :
+     |                                                @                      :
+     |                        .                       @                      :
+     |                        :                       @                      :
+     |                        :                       @                      :
+     |                        :                       @                      :
+     |                        :                       @                      :
+     |                        :                       @                      :
+     |                        :                       @                      :
+   0 +----------------------------------------------------------------------->KB
+     0                                                                   2.930
+
+Number of snapshots: 4
+ Detailed snapshots: [2]
+
+--------------------------------------------------------------------------------
+  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
+--------------------------------------------------------------------------------
+  0              0                0                0             0            0
+  1          1,000            1,000            1,000             0            0
+  2          2,000            2,000            2,000             0            0
+100.00% (2,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
+->100.00% (2,000B) 0x........: abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJab...
+  ->50.00% (1,000B) 0x........: main (long-names.c:68)
+  | 
+  ->50.00% (1,000B) 0x........: abcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJabcdefghijABCDEFGHIJabcdefghijabcdefghijABCDEFGHIJa...
+    ->50.00% (1,000B) 0x........: main (long-names.c:68)
+      
+--------------------------------------------------------------------------------
+  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
+--------------------------------------------------------------------------------
+  3          3,000            3,000            3,000             0            0
diff --git a/massif/tests/long-names.stderr.exp b/massif/tests/long-names.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/massif/tests/long-names.vgtest b/massif/tests/long-names.vgtest
new file mode 100644 (file)
index 0000000..f071366
--- /dev/null
@@ -0,0 +1,4 @@
+prog: long-names
+vgopts: --stacks=no --time-unit=B --heap-admin=0 --massif-out-file=massif.out --detailed-freq=3
+post: perl ../../massif/ms_print massif.out | ../../tests/filter_addresses
+cleanup: rm massif.out