1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
/* 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;
|