/* PR tree-optimization/97027 - missing warning on buffer overflow storing a larger scalar into a smaller array Verify warnings for overflow by stores of results of built-in functions. { dg-do compile } { dg-options "-O2" } { dg-require-effective-target alloca } */ typedef __INT16_TYPE__ int16_t; typedef __SIZE_TYPE__ size_t; extern int abs (int); extern void* alloca (size_t); extern double nan (const char *); #ifdef __DEC32_MAX__ _Decimal32 nand32 (const char *); #else /* _Decimal32 is supported only conditionally and not available on all targets. */ # define _Decimal32 double # define nand32(s) nan (s) #endif extern size_t strlen (const char *); extern char* strcpy (char *, const char *); extern unsigned char ax[], a1[1], a2[2], a8[8]; void nowarn_abs (int i) { *(int *)ax = abs (i); *(char *)a1 = abs (i); } void warn_abs (int i) { *(int *)a1 = abs (i); // { dg-warning "\\\[-Wstringop-overflow" } } void nowarn_alloca (size_t n) { *(void **)ax = alloca (n); } void warn_alloca (size_t n) { *(void **)a1 = alloca (n); // { dg-warning "\\\[-Wstringop-overflow" } } void nowarn_complex (double x, double i) { *(_Complex double *)ax = __builtin_complex (x, i); } void warn_complex (double x, double i) { _Complex double *p = (_Complex double *)a1; *p = __builtin_complex (x, i); // { dg-warning "\\\[-Wstringop-overflow" "pr101455" { xfail *-*-* } } } __attribute__ ((noipa)) void nowarn_nan (const char *s) { *(double *)ax = nan (s); } __attribute__ ((noipa)) void warn_nan (const char *s) { *(double *)a1 = nan (s); // { dg-warning "\\\[-Wstringop-overflow" } } __attribute__ ((noipa)) void nowarn_nand32 (const char *s) { *(_Decimal32 *)ax = nand32 (s); } __attribute__ ((noipa)) void warn_nand32 (const char *s) { *(_Decimal32 *)a1 = nand32 (s); // { dg-warning "\\\[-Wstringop-overflow" } } void nowarn_strlen (const char *s1, const char *s2, const char *s3) { *(char *)ax = strlen (s1); *(char *)a1 = strlen (s2); *(size_t *)a8 = strlen (s3); } void warn_strlen (const char *s1, const char *s2) { *(int16_t *)a1 = strlen (s1); // { dg-warning "\\\[-Wstringop-overflow" } *(size_t *)a2 = strlen (s2); // { dg-warning "\\\[-Wstringop-overflow" "!ptr_eq_short" { target { ! ptr_eq_short } } } } void nowarn_strcpy (char *s1, char *s2, const char *s3) { *(char **)ax = strcpy (s1, s2); *(char **)a8 = strcpy (s2, s3); } void warn_strcpy (char *s1, char *s2, const char *s3) { *(char **)a1 = strcpy (s1, s2); // { dg-warning "\\\[-Wstringop-overflow" } *(char **)a2 = strcpy (s2, s3); // { dg-warning "\\\[-Wstringop-overflow" "!ptr_eq_short" { target { ! ptr_eq_short } } } }