This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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 installed]: test past trailing NUL for str* builtins


Some of the existing string builtins use strcmp/strncmp to test their
results.  Others use memcmp and peek a few bytes past the trailing NUL
to ensure the builtin didn't modify anything extra that it wasn't
supposed to.

I prefer the more rigorous memcmp test so I converted the few tests
that use strcmp/strncmp to memcmp.

Tested via "make check" on x86_64-unknown-linux-gnu and installed as
obvious.

		--Kaveh



2005-03-31  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	* gcc.c-torture/execute/builtins/strcat.c: Check the result
	buffer past the terminating NUL using memcmp.
	* gcc.c-torture/execute/builtins/strncat.c: Likewise.
	* gcc.c-torture/execute/builtins/strncpy.c: Likewise.
: 
diff -rup orig/egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c
--- orig/egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c	2004-07-02 22:16:49.000000000 -0400
+++ egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c	2005-03-31 19:02:24.761870360 -0500
@@ -10,7 +10,6 @@ extern void abort (void);
 typedef __SIZE_TYPE__ size_t;
 extern char *strcat (char *, const char *);
 extern char *strcpy (char *, const char *);
-extern int strcmp (const char *, const char *);
 extern void *memset (void *, int, size_t);
 extern int memcmp (const void *, const void *, size_t);
 #define RESET_DST_WITH(FILLER) \
@@ -23,19 +22,22 @@ void main_test (void)
   char dst[64], *d2;
   
   RESET_DST_WITH (s1);
-  if (strcat (dst, "") != dst || strcmp (dst, s1))
+  if (strcat (dst, "") != dst || memcmp (dst, "hello world\0XXX", 15))
     abort();
   RESET_DST_WITH (s1);
-  if (strcat (dst, s2) != dst || strcmp (dst, s1))
+  if (strcat (dst, s2) != dst || memcmp (dst, "hello world\0XXX", 15))
     abort();
   RESET_DST_WITH (s1); d2 = dst;
-  if (strcat (++d2, s2) != dst+1 || d2 != dst+1 || strcmp (dst, s1))
+  if (strcat (++d2, s2) != dst+1 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
   RESET_DST_WITH (s1); d2 = dst;
-  if (strcat (++d2+5, s2) != dst+6 || d2 != dst+1 || strcmp (dst, s1))
+  if (strcat (++d2+5, s2) != dst+6 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
   RESET_DST_WITH (s1); d2 = dst;
-  if (strcat (++d2+5, s1+11) != dst+6 || d2 != dst+1 || strcmp (dst, s1))
+  if (strcat (++d2+5, s1+11) != dst+6 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
 
 #ifndef __OPTIMIZE_SIZE__
@@ -74,6 +76,6 @@ void main_test (void)
   /* Test at least one instance of the __builtin_ style.  We do this
      to ensure that it works and that the prototype is correct.  */
   RESET_DST_WITH (s1);
-  if (__builtin_strcat (dst, "") != dst || strcmp (dst, s1))
+  if (__builtin_strcat (dst, "") != dst || memcmp (dst, "hello world\0XXX", 15))
     abort();
 }
diff -rup orig/egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c
--- orig/egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c	2004-07-02 22:16:50.000000000 -0400
+++ egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c	2005-03-31 18:58:47.399914400 -0500
@@ -9,9 +9,14 @@ extern void abort (void);
 typedef __SIZE_TYPE__ size_t;
 extern char *strncat (char *, const char *, size_t);
 extern char *strcpy (char *, const char *);
-extern int strcmp (const char *, const char *);
+extern void *memset (void *, int, size_t);
+extern int memcmp (const void *, const void *, size_t);
 int x = 123;
 
+/* Reset the destination buffer to a known state. */
+#define RESET_DST_WITH(FILLER) \
+  do { memset (dst, 'X', sizeof (dst)); strcpy (dst, (FILLER)); } while (0)
+
 void
 main_test (void)
 {
@@ -19,54 +24,59 @@ main_test (void)
   const char *const s2 = "";
   char dst[64], *d2;
   
-  strcpy (dst, s1);
-  if (strncat (dst, "", 100) != dst || strcmp (dst, s1))
+  RESET_DST_WITH (s1);
+  if (strncat (dst, "", 100) != dst || memcmp (dst, "hello world\0XXX", 15))
     abort();
-  strcpy (dst, s1);
-  if (strncat (dst, s2, 100) != dst || strcmp (dst, s1))
+  RESET_DST_WITH (s1);
+  if (strncat (dst, s2, 100) != dst || memcmp (dst, "hello world\0XXX", 15))
     abort();
-  strcpy (dst, s1); d2 = dst;
-  if (strncat (++d2, s2, 100) != dst+1 || d2 != dst+1 || strcmp (dst, s1))
+  RESET_DST_WITH (s1); d2 = dst;
+  if (strncat (++d2, s2, 100) != dst+1 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
-  strcpy (dst, s1); d2 = dst;
-  if (strncat (++d2+5, s2, 100) != dst+6 || d2 != dst+1 || strcmp (dst, s1))
+  RESET_DST_WITH (s1); d2 = dst;
+  if (strncat (++d2+5, s2, 100) != dst+6 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
-  strcpy (dst, s1); d2 = dst;
-  if (strncat (++d2+5, s1+11, 100) != dst+6 || d2 != dst+1 || strcmp (dst, s1))
+  RESET_DST_WITH (s1); d2 = dst;
+  if (strncat (++d2+5, s1+11, 100) != dst+6 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
-  strcpy (dst, s1); d2 = dst;
-  if (strncat (++d2+5, s1, 0) != dst+6 || d2 != dst+1 || strcmp (dst, s1))
+  RESET_DST_WITH (s1); d2 = dst;
+  if (strncat (++d2+5, s1, 0) != dst+6 || d2 != dst+1
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
-  strcpy (dst, s1); d2 = dst;
+  RESET_DST_WITH (s1); d2 = dst;
   if (strncat (++d2+5, "", ++x) != dst+6 || d2 != dst+1 || x != 124
-      || strcmp (dst, s1))
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
 
-  strcpy (dst, s1);
-  if (strncat (dst, "foo", 3) != dst || strcmp (dst, "hello worldfoo"))
+  RESET_DST_WITH (s1);
+  if (strncat (dst, "foo", 3) != dst || memcmp (dst, "hello worldfoo\0XXX", 18))
     abort();
-  strcpy (dst, s1);
-  if (strncat (dst, "foo", 100) != dst || strcmp (dst, "hello worldfoo"))
+  RESET_DST_WITH (s1);
+  if (strncat (dst, "foo", 100) != dst || memcmp (dst, "hello worldfoo\0XXX", 18))
     abort();
-  strcpy (dst, s1);
-  if (strncat (dst, s1, 100) != dst || strcmp (dst, "hello worldhello world"))
+  RESET_DST_WITH (s1);
+  if (strncat (dst, s1, 100) != dst || memcmp (dst, "hello worldhello world\0XXX", 26))
     abort();
-  strcpy (dst, s1); d2 = dst;
+  RESET_DST_WITH (s1); d2 = dst;
   if (strncat (++d2, s1, 100) != dst+1 || d2 != dst+1
-      || strcmp (dst, "hello worldhello world"))
+      || memcmp (dst, "hello worldhello world\0XXX", 26))
     abort();
-  strcpy (dst, s1); d2 = dst;
+  RESET_DST_WITH (s1); d2 = dst;
   if (strncat (++d2+5, s1, 100) != dst+6 || d2 != dst+1
-      || strcmp (dst, "hello worldhello world"))
+      || memcmp (dst, "hello worldhello world\0XXX", 26))
     abort();
-  strcpy (dst, s1); d2 = dst;
+  RESET_DST_WITH (s1); d2 = dst;
   if (strncat (++d2+5, s1+5, 100) != dst+6 || d2 != dst+1
-      || strcmp (dst, "hello world world"))
+      || memcmp (dst, "hello world world\0XXX", 21))
     abort();
 
   /* Test at least one instance of the __builtin_ style.  We do this
      to ensure that it works and that the prototype is correct.  */
-  strcpy (dst, s1);
-  if (__builtin_strncat (dst, "", 100) != dst || strcmp (dst, s1))
+  RESET_DST_WITH (s1);
+  if (__builtin_strncat (dst, "", 100) != dst
+      || memcmp (dst, "hello world\0XXX", 15))
     abort();
 }
diff -rup orig/egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c
--- orig/egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c	2004-07-02 22:16:50.000000000 -0400
+++ egcc-CVS20050330/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c	2005-03-31 18:58:42.113718024 -0500
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000  Free Software Foundation.
+/* Copyright (C) 2000, 2005  Free Software Foundation.
 
    Ensure all expected transformations of builtin strncpy occur and
    perform correctly.
@@ -8,10 +8,12 @@
 extern void abort (void);
 typedef __SIZE_TYPE__ size_t;
 extern char *strncpy (char *, const char *, size_t);
-extern int strcmp (const char *, const char *);
-extern int strncmp (const char *, const char *, size_t);
+extern int memcmp (const void *, const void *, size_t);
 extern void *memset (void *, int, size_t);
 
+/* Reset the destination buffer to a known state. */
+#define RESET_DST memset(dst, 'X', sizeof(dst))
+
 int i;
 
 void
@@ -21,55 +23,53 @@ main_test (void)
   const char *src2;
   char dst[64], *dst2;
   
-  memset (dst, 0, sizeof (dst));
-  if (strncpy (dst, src, 4) != dst || strncmp (dst, src, 4))
+  RESET_DST;
+  if (strncpy (dst, src, 4) != dst || memcmp (dst, "hellXXX", 7))
     abort();
 
-  memset (dst, 0, sizeof (dst));
-  if (strncpy (dst+16, src, 4) != dst+16 || strncmp (dst+16, src, 4))
+  RESET_DST;
+  if (strncpy (dst+16, src, 4) != dst+16 || memcmp (dst+16, "hellXXX", 7))
     abort();
 
-  memset (dst, 0, sizeof (dst));
-  if (strncpy (dst+32, src+5, 4) != dst+32 || strncmp (dst+32, src+5, 4))
+  RESET_DST;
+  if (strncpy (dst+32, src+5, 4) != dst+32 || memcmp (dst+32, " worXXX", 7))
     abort();
 
-  memset (dst, 0, sizeof (dst));
+  RESET_DST;
   dst2 = dst;
-  if (strncpy (++dst2, src+5, 4) != dst+1 || strncmp (dst2, src+5, 4)
+  if (strncpy (++dst2, src+5, 4) != dst+1 || memcmp (dst2, " worXXX", 7)
       || dst2 != dst+1)
     abort();
 
-  memset (dst, 0, sizeof (dst));
-  if (strncpy (dst, src, 0) != dst || strcmp (dst, ""))
+  RESET_DST;
+  if (strncpy (dst, src, 0) != dst || memcmp (dst, "XXX", 3))
     abort();
   
-  memset (dst, 0, sizeof (dst));
+  RESET_DST;
   dst2 = dst; src2 = src;
-  if (strncpy (++dst2, ++src2, 0) != dst+1 || strcmp (dst2, "")
+  if (strncpy (++dst2, ++src2, 0) != dst+1 || memcmp (dst2, "XXX", 3)
       || dst2 != dst+1 || src2 != src+1)
     abort();
 
-  memset (dst, 0, sizeof (dst));
+  RESET_DST;
   dst2 = dst; src2 = src;
-  if (strncpy (++dst2+5, ++src2+5, 0) != dst+6 || strcmp (dst2+5, "")
+  if (strncpy (++dst2+5, ++src2+5, 0) != dst+6 || memcmp (dst2+5, "XXX", 3)
       || dst2 != dst+1 || src2 != src+1)
     abort();
 
-  memset (dst, 0, sizeof (dst));
-  if (strncpy (dst, src, 12) != dst || strcmp (dst, src))
+  RESET_DST;
+  if (strncpy (dst, src, 12) != dst || memcmp (dst, "hello world\0XXX", 15))
     abort();
 
   /* Test at least one instance of the __builtin_ style.  We do this
      to ensure that it works and that the prototype is correct.  */
-  memset (dst, 0, sizeof (dst));
-  if (__builtin_strncpy (dst, src, 4) != dst || strncmp (dst, src, 4))
+  RESET_DST;
+  if (__builtin_strncpy (dst, src, 4) != dst || memcmp (dst, "hellXXX", 7))
     abort();
 
-  memset (dst, 0, sizeof (dst));
+  RESET_DST;
   if (strncpy (dst, i++ ? "xfoo" + 1 : "bar", 4) != dst
-      || strcmp (dst, "bar")
+      || memcmp (dst, "bar\0XXX", 7)
       || i != 1)
     abort ();
-
-  return 0;
 }


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