OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [gcc.c-torture/] [execute/] [builtins/] [strcat-chk.c] - Diff between revs 297 and 338

Only display areas with differences | Details | Blame | View Log

Rev 297 Rev 338
/* Copyright (C) 2004, 2005  Free Software Foundation.
/* Copyright (C) 2004, 2005  Free Software Foundation.
 
 
   Ensure builtin __strcat_chk performs correctly.  */
   Ensure builtin __strcat_chk performs correctly.  */
 
 
extern void abort (void);
extern void abort (void);
typedef __SIZE_TYPE__ size_t;
typedef __SIZE_TYPE__ size_t;
extern size_t strlen(const char *);
extern size_t strlen(const char *);
extern void *memcpy (void *, const void *, size_t);
extern void *memcpy (void *, const void *, size_t);
extern char *strcat (char *, const char *);
extern char *strcat (char *, const char *);
extern int memcmp (const void *, const void *, size_t);
extern int memcmp (const void *, const void *, size_t);
extern char *strcpy (char *, const char *);
extern char *strcpy (char *, const char *);
extern int strcmp (const char *, const char *);
extern int strcmp (const char *, const char *);
extern void *memset (void *, int, size_t);
extern void *memset (void *, int, size_t);
#define RESET_DST_WITH(FILLER) \
#define RESET_DST_WITH(FILLER) \
  do { memset (dst, 'X', sizeof (dst)); strcpy (dst, (FILLER)); } while (0)
  do { memset (dst, 'X', sizeof (dst)); strcpy (dst, (FILLER)); } while (0)
 
 
#include "chk.h"
#include "chk.h"
 
 
const char s1[] = "123";
const char s1[] = "123";
char p[32] = "";
char p[32] = "";
char *s2 = "defg";
char *s2 = "defg";
char *s3 = "FGH";
char *s3 = "FGH";
char *s4;
char *s4;
size_t l1 = 1;
size_t l1 = 1;
char *s5;
char *s5;
 
 
void
void
__attribute__((noinline))
__attribute__((noinline))
test1 (void)
test1 (void)
{
{
  const char *const x1 = "hello world";
  const char *const x1 = "hello world";
  const char *const x2 = "";
  const char *const x2 = "";
  char dst[64], *d2;
  char dst[64], *d2;
 
 
  chk_calls = 0;
  chk_calls = 0;
  strcat_disallowed = 1;
  strcat_disallowed = 1;
  /* Following strcat calls should be optimized out at compile time.  */
  /* Following strcat calls should be optimized out at compile time.  */
  RESET_DST_WITH (x1);
  RESET_DST_WITH (x1);
  if (strcat (dst, "") != dst || strcmp (dst, x1))
  if (strcat (dst, "") != dst || strcmp (dst, x1))
    abort ();
    abort ();
  RESET_DST_WITH (x1);
  RESET_DST_WITH (x1);
  if (strcat (dst, x2) != dst || strcmp (dst, x1))
  if (strcat (dst, x2) != dst || strcmp (dst, x1))
    abort ();
    abort ();
  RESET_DST_WITH (x1); d2 = dst;
  RESET_DST_WITH (x1); d2 = dst;
  if (strcat (++d2, x2) != dst+1 || d2 != dst+1 || strcmp (dst, x1))
  if (strcat (++d2, x2) != dst+1 || d2 != dst+1 || strcmp (dst, x1))
    abort ();
    abort ();
  RESET_DST_WITH (x1); d2 = dst;
  RESET_DST_WITH (x1); d2 = dst;
  if (strcat (++d2+5, x2) != dst+6 || d2 != dst+1 || strcmp (dst, x1))
  if (strcat (++d2+5, x2) != dst+6 || d2 != dst+1 || strcmp (dst, x1))
    abort ();
    abort ();
  RESET_DST_WITH (x1); d2 = dst;
  RESET_DST_WITH (x1); d2 = dst;
  if (strcat (++d2+5, x1+11) != dst+6 || d2 != dst+1 || strcmp (dst, x1))
  if (strcat (++d2+5, x1+11) != dst+6 || d2 != dst+1 || strcmp (dst, x1))
    abort ();
    abort ();
  if (chk_calls)
  if (chk_calls)
    abort ();
    abort ();
  strcat_disallowed = 0;
  strcat_disallowed = 0;
 
 
  RESET_DST_WITH (x1);
  RESET_DST_WITH (x1);
  if (strcat (dst, " 1111") != dst
  if (strcat (dst, " 1111") != dst
      || memcmp (dst, "hello world 1111\0XXX", 20))
      || memcmp (dst, "hello world 1111\0XXX", 20))
    abort ();
    abort ();
 
 
  RESET_DST_WITH (x1);
  RESET_DST_WITH (x1);
  if (strcat (dst+5, " 2222") != dst+5
  if (strcat (dst+5, " 2222") != dst+5
      || memcmp (dst, "hello world 2222\0XXX", 20))
      || memcmp (dst, "hello world 2222\0XXX", 20))
    abort ();
    abort ();
 
 
  RESET_DST_WITH (x1); d2 = dst;
  RESET_DST_WITH (x1); d2 = dst;
  if (strcat (++d2+5, " 3333") != dst+6 || d2 != dst+1
  if (strcat (++d2+5, " 3333") != dst+6 || d2 != dst+1
      || memcmp (dst, "hello world 3333\0XXX", 20))
      || memcmp (dst, "hello world 3333\0XXX", 20))
    abort ();
    abort ();
 
 
  RESET_DST_WITH (x1);
  RESET_DST_WITH (x1);
  strcat (strcat (strcat (strcat (strcat (strcat (dst, ": this "), ""),
  strcat (strcat (strcat (strcat (strcat (strcat (dst, ": this "), ""),
                                  "is "), "a "), "test"), ".");
                                  "is "), "a "), "test"), ".");
  if (memcmp (dst, "hello world: this is a test.\0X", 30))
  if (memcmp (dst, "hello world: this is a test.\0X", 30))
    abort ();
    abort ();
 
 
  chk_calls = 0;
  chk_calls = 0;
  strcat_disallowed = 1;
  strcat_disallowed = 1;
  /* Test at least one instance of the __builtin_ style.  We do this
  /* Test at least one instance of the __builtin_ style.  We do this
     to ensure that it works and that the prototype is correct.  */
     to ensure that it works and that the prototype is correct.  */
  RESET_DST_WITH (x1);
  RESET_DST_WITH (x1);
  if (__builtin_strcat (dst, "") != dst || strcmp (dst, x1))
  if (__builtin_strcat (dst, "") != dst || strcmp (dst, x1))
    abort ();
    abort ();
  if (chk_calls)
  if (chk_calls)
    abort ();
    abort ();
  strcat_disallowed = 0;
  strcat_disallowed = 0;
}
}
 
 
 
 
/* Test whether compile time checking is done where it should
/* Test whether compile time checking is done where it should
   and so is runtime object size checking.  */
   and so is runtime object size checking.  */
void
void
__attribute__((noinline))
__attribute__((noinline))
test2 (void)
test2 (void)
{
{
  struct A { char buf1[10]; char buf2[10]; } a;
  struct A { char buf1[10]; char buf2[10]; } a;
  char *r = l1 == 1 ? &a.buf1[5] : &a.buf2[4];
  char *r = l1 == 1 ? &a.buf1[5] : &a.buf2[4];
  char buf3[20];
  char buf3[20];
  int i;
  int i;
 
 
  /* The following calls should do runtime checking
  /* The following calls should do runtime checking
     - source length is not known, but destination is.  */
     - source length is not known, but destination is.  */
  memset (&a, '\0', sizeof (a));
  memset (&a, '\0', sizeof (a));
  s5 = (char *) &a;
  s5 = (char *) &a;
  __asm __volatile ("" : : "r" (s5) : "memory");
  __asm __volatile ("" : : "r" (s5) : "memory");
  chk_calls = 0;
  chk_calls = 0;
  strcat (a.buf1 + 2, s3 + 3);
  strcat (a.buf1 + 2, s3 + 3);
  strcat (r, s3 + 2);
  strcat (r, s3 + 2);
  r = l1 == 1 ? __builtin_alloca (4) : &a.buf2[7];
  r = l1 == 1 ? __builtin_alloca (4) : &a.buf2[7];
  memset (r, '\0', 3);
  memset (r, '\0', 3);
  __asm __volatile ("" : : "r" (r) : "memory");
  __asm __volatile ("" : : "r" (r) : "memory");
  strcat (r, s2 + 2);
  strcat (r, s2 + 2);
  strcat (r + 2, s3 + 3);
  strcat (r + 2, s3 + 3);
  r = buf3;
  r = buf3;
  for (i = 0; i < 4; ++i)
  for (i = 0; i < 4; ++i)
    {
    {
      if (i == l1 - 1)
      if (i == l1 - 1)
        r = &a.buf1[1];
        r = &a.buf1[1];
      else if (i == l1)
      else if (i == l1)
        r = &a.buf2[7];
        r = &a.buf2[7];
      else if (i == l1 + 1)
      else if (i == l1 + 1)
        r = &buf3[5];
        r = &buf3[5];
      else if (i == l1 + 2)
      else if (i == l1 + 2)
        r = &a.buf1[9];
        r = &a.buf1[9];
    }
    }
  strcat (r, s2 + 4);
  strcat (r, s2 + 4);
  if (chk_calls != 5)
  if (chk_calls != 5)
    abort ();
    abort ();
 
 
  /* Following have known destination and known source length,
  /* Following have known destination and known source length,
     but we don't know the length of dest string, so runtime checking
     but we don't know the length of dest string, so runtime checking
     is needed too.  */
     is needed too.  */
  memset (&a, '\0', sizeof (a));
  memset (&a, '\0', sizeof (a));
  chk_calls = 0;
  chk_calls = 0;
  s5 = (char *) &a;
  s5 = (char *) &a;
  __asm __volatile ("" : : "r" (s5) : "memory");
  __asm __volatile ("" : : "r" (s5) : "memory");
  strcat (a.buf1 + 2, "a");
  strcat (a.buf1 + 2, "a");
  strcat (r, "");
  strcat (r, "");
  r = l1 == 1 ? __builtin_alloca (4) : &a.buf2[7];
  r = l1 == 1 ? __builtin_alloca (4) : &a.buf2[7];
  memset (r, '\0', 3);
  memset (r, '\0', 3);
  __asm __volatile ("" : : "r" (r) : "memory");
  __asm __volatile ("" : : "r" (r) : "memory");
  strcat (r, s1 + 1);
  strcat (r, s1 + 1);
  if (chk_calls != 2)
  if (chk_calls != 2)
    abort ();
    abort ();
  chk_calls = 0;
  chk_calls = 0;
  /* Unknown destination and source, no checking.  */
  /* Unknown destination and source, no checking.  */
  strcat (s4, s3);
  strcat (s4, s3);
  if (chk_calls)
  if (chk_calls)
    abort ();
    abort ();
  chk_calls = 0;
  chk_calls = 0;
}
}
 
 
/* Test whether runtime and/or compile time checking catches
/* Test whether runtime and/or compile time checking catches
   buffer overflows.  */
   buffer overflows.  */
void
void
__attribute__((noinline))
__attribute__((noinline))
test3 (void)
test3 (void)
{
{
  struct A { char buf1[10]; char buf2[10]; } a;
  struct A { char buf1[10]; char buf2[10]; } a;
  char buf3[20];
  char buf3[20];
 
 
  memset (&a, '\0', sizeof (a));
  memset (&a, '\0', sizeof (a));
  memset (buf3, '\0', sizeof (buf3));
  memset (buf3, '\0', sizeof (buf3));
  s5 = (char *) &a;
  s5 = (char *) &a;
  __asm __volatile ("" : : "r" (s5) : "memory");
  __asm __volatile ("" : : "r" (s5) : "memory");
  s5 = buf3;
  s5 = buf3;
  __asm __volatile ("" : : "r" (s5) : "memory");
  __asm __volatile ("" : : "r" (s5) : "memory");
  chk_fail_allowed = 1;
  chk_fail_allowed = 1;
  /* Runtime checks.  */
  /* Runtime checks.  */
  if (__builtin_setjmp (chk_fail_buf) == 0)
  if (__builtin_setjmp (chk_fail_buf) == 0)
    {
    {
      strcat (&a.buf2[9], s2 + 3);
      strcat (&a.buf2[9], s2 + 3);
      abort ();
      abort ();
    }
    }
  if (__builtin_setjmp (chk_fail_buf) == 0)
  if (__builtin_setjmp (chk_fail_buf) == 0)
    {
    {
      strcat (&a.buf2[7], s3 + strlen (s3) - 3);
      strcat (&a.buf2[7], s3 + strlen (s3) - 3);
      abort ();
      abort ();
    }
    }
  if (__builtin_setjmp (chk_fail_buf) == 0)
  if (__builtin_setjmp (chk_fail_buf) == 0)
    {
    {
      strcat (&buf3[19], "a");
      strcat (&buf3[19], "a");
      abort ();
      abort ();
    }
    }
  chk_fail_allowed = 0;
  chk_fail_allowed = 0;
}
}
 
 
void
void
main_test (void)
main_test (void)
{
{
#ifndef __OPTIMIZE__
#ifndef __OPTIMIZE__
  /* Object size checking is only intended for -O[s123].  */
  /* Object size checking is only intended for -O[s123].  */
  return;
  return;
#endif
#endif
  __asm ("" : "=r" (s2) : "0" (s2));
  __asm ("" : "=r" (s2) : "0" (s2));
  __asm ("" : "=r" (s3) : "0" (s3));
  __asm ("" : "=r" (s3) : "0" (s3));
  __asm ("" : "=r" (l1) : "0" (l1));
  __asm ("" : "=r" (l1) : "0" (l1));
  s4 = p;
  s4 = p;
  test1 ();
  test1 ();
  memset (p, '\0', sizeof (p));
  memset (p, '\0', sizeof (p));
  test2 ();
  test2 ();
  test3 ();
  test3 ();
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.