From: ghazi Date: Fri, 1 Apr 2005 13:48:19 +0000 (+0000) Subject: * gcc.c-torture/execute/builtins/strcat.c: Check the result X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=2af9d040b3b96b5f7ae2eddc46367adb07c27f35;p=pf3gnuchains%2Fgcc-fork.git * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97388 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d00a477aa2..4a21f16a41f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2005-04-01 Kaveh R. Ghazi + * 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. + * gcc.c-torture/execute/builtins/strncmp-2.c: Also test x86_64. Fix unused/uninitialized variable warnings. diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c b/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c index ba70c397724..0fb1ba1c4e7 100644 --- a/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c +++ b/gcc/testsuite/gcc.c-torture/execute/builtins/strcat.c @@ -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 --git a/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c b/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c index 2ef0e01aebc..1a093baf731 100644 --- a/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c +++ b/gcc/testsuite/gcc.c-torture/execute/builtins/strncat.c @@ -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 --git a/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c b/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c index c0a815701e6..9918cdf6af9 100644 --- a/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c +++ b/gcc/testsuite/gcc.c-torture/execute/builtins/strncpy.c @@ -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; }