mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 20:21:28 +08:00
strcat.c: Check the result buffer past the terminating NUL using memcmp.
* 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. From-SVN: r97388
This commit is contained in:
parent
55badfdae8
commit
88ec1cc98b
@ -1,5 +1,10 @@
|
||||
2005-04-01 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.
|
||||
|
||||
* gcc.c-torture/execute/builtins/strncmp-2.c: Also test x86_64.
|
||||
Fix unused/uninitialized variable warnings.
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user