view gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-7.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
line wrap: on
line source

/* PR tree-optimization/77671 - missing -Wformat-overflow warning
   on sprintf overflow with "%s"
   { dg-compile }
   { dg-options "-O2 -Wformat -Wno-format-zero-length -fdump-tree-optimized" } */

void sink (char*);

extern char buffer[];

/* String exactly 4100 characters long (plus the terminating NUL).  */
extern const char s4100[4101];

void test_sprintf (const char *s)
{
#define IGN(...) __builtin_sprintf (buffer, __VA_ARGS__); sink (buffer)

  /* Each of the following calls is expected to be transformed into
     one of memcpy or strcpy.  */
  IGN ("");
  IGN ("a");
  IGN ("ab");
  /* FIXME: Transform to strcpy/memcpy.  */
  /* IGN (s4100 + 5); */

  IGN ("%s", "");
  IGN ("%s", "a");
  IGN ("%s", "ab");

  IGN ("%s", s4100 + 5);

  /* FIXME: This can be transformed into strcpy.  */
  /* IGN (s); */
  IGN ("%s", s);
}


void test_snprintf (void)
{
#undef IGN
#define IGN(N, ...) __builtin_snprintf (buffer, N, __VA_ARGS__); sink (buffer)

  /* Each of the following calls is expected to be transformed into
     one of memcpy or strcpy.  */
  IGN (1, "");
  IGN (2, "1");
  IGN (8, "1234567");

  /* FIXME: Transform to strcpy/memcpy.  */
  /* IGN (4096, s4100 + 5); */

  IGN (1, "%s", "");
  IGN (2, "%s", "1");
  IGN (8, "%s", "1234567");

  IGN (4096, "%s", s4100 + 5);
}

#if 0   /* FIXME: Implement vs{,n}printf optimization.  */

void test_vsprintf (__builtin_va_list va)
{
#undef IGN
#define IGN(fmt) __builtin_vsprintf (buffer, fmt, va); sink (buffer)

  /* Each of the following calls is expected to be transformed into
     one of memcpy or strcpy.  */
  IGN ("");
  IGN ("a");
  IGN ("ab");
  IGN (s4100 + 5);

  IGN ("%s");
}

void test_vsnprintf (__builtin_va_list va)
{
#undef IGN
#define IGN(N, fmt) __builtin_vsnprintf (buffer, N, fmt, va); sink (buffer)

  /* Each of the following calls is expected to be transformed into
     one of memcpy or strcpy.  */
  IGN (   1, "");
  IGN (   2, "1");
  IGN (   8, "1234567");
  IGN (4096, s4100 + 5);
}

#endif

/* { dg-final { scan-tree-dump-not "builtin_sprintf" "optimized" } }
   { dg-final { scan-tree-dump-not "builtin_snprintf" "optimized" } }
   { dg-final { scan-tree-dump-not "builtin_vsprintf" "optimized" } }
   { dg-final { scan-tree-dump-not "builtin_vsnprintf" "optimized" } } */

#define S10    "0123456789"
#define S100   S10 S10 S10 S10 S10  S10 S10 S10 S10 S10
#define S1000  S100 S100 S100 S100 S100  S100 S100 S100 S100 S100

const char s4100[4101] = S1000 S1000 S1000 S1000 S100;