other/7814: incorrect scheduling for glibc-2.2.92 stpcpy test
Glen Nakamura
glen@imodulo.com
Mon Sep 2 12:36:00 GMT 2002
Hmm, I intended to file this under optimization, but I must have selected
other by mistake... *grr* Anyway, here is the C source for the uploaded
testcase.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=7814
-------------- next part --------------
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
const char *it = "<UNSET>"; /* Routine name for message routines. */
size_t errors = 0;
/* Complain if condition is not true. */
static void
check (int thing, int number)
{
if (!thing)
{
printf("%s flunked test %d\n", it, number);
++errors;
}
}
/* Complain if first two args don't strcmp as equal. */
static void
equal (const char *a, const char *b, int number)
{
check(a != NULL && b != NULL && (strcmp (a, b) == 0), number);
}
char one[50];
char two[50];
char *cp;
#undef __stpcpy
# define __stpcpy(dest, src) \
(__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
? __builtin_strcpy (dest, src) + strlen (src) \
: ((char *) (__mempcpy) (dest, src, strlen (src) + 1) \
- 1)) \
: __stpcpy (dest, src)))
static void
test_stpcpy (void)
{
it = "stpcpy";
check ((stpcpy (one, "a") - one) == 1, 1);
equal (one, "a", 2);
check ((stpcpy (one, "ab") - one) == 2, 3);
equal (one, "ab", 4);
check ((stpcpy (one, "abc") - one) == 3, 5);
equal (one, "abc", 6);
check ((stpcpy (one, "abcd") - one) == 4, 7);
equal (one, "abcd", 8);
check ((stpcpy (one, "abcde") - one) == 5, 9);
equal (one, "abcde", 10);
check ((stpcpy (one, "abcdef") - one) == 6, 11);
equal (one, "abcdef", 12);
check ((stpcpy (one, "abcdefg") - one) == 7, 13);
equal (one, "abcdefg", 14);
check ((stpcpy (one, "abcdefgh") - one) == 8, 15);
equal (one, "abcdefgh", 16);
check ((stpcpy (one, "abcdefghi") - one) == 9, 17);
equal (one, "abcdefghi", 18);
check ((stpcpy (one, "x") - one) == 1, 19);
equal (one, "x", 20); /* Writeover. */
equal (one+2, "cdefghi", 21); /* Wrote too much? */
check ((stpcpy (one, "xx") - one) == 2, 22);
equal (one, "xx", 23); /* Writeover. */
equal (one+3, "defghi", 24); /* Wrote too much? */
check ((stpcpy (one, "xxx") - one) == 3, 25);
equal (one, "xxx", 26); /* Writeover. */
equal (one+4, "efghi", 27); /* Wrote too much? */
check ((stpcpy (one, "xxxx") - one) == 4, 28);
equal (one, "xxxx", 29); /* Writeover. */
equal (one+5, "fghi", 30); /* Wrote too much? */
check ((stpcpy (one, "xxxxx") - one) == 5, 31);
equal (one, "xxxxx", 32); /* Writeover. */
equal (one+6, "ghi", 33); /* Wrote too much? */
check ((stpcpy (one, "xxxxxx") - one) == 6, 34);
equal (one, "xxxxxx", 35); /* Writeover. */
equal (one+7, "hi", 36); /* Wrote too much? */
check ((stpcpy (one, "xxxxxxx") - one) == 7, 37);
equal (one, "xxxxxxx", 38); /* Writeover. */
equal (one+8, "i", 39); /* Wrote too much? */
check ((stpcpy (stpcpy (stpcpy (one, "a"), "b"), "c") - one) == 3, 40);
equal (one, "abc", 41);
equal (one + 4, "xxx", 42);
}
int
main (void)
{
int status;
/* A closely related function is stpcpy. */
test_stpcpy ();
if (errors == 0)
{
status = 0;
puts("No errors.");
}
else
{
status = 1;
printf("%Zd errors.\n", errors);
}
return status;
}
More information about the Gcc-bugs
mailing list