1 /* Exercise that -Warray-bounds is issued for out-of-bounds offsets
2 in calls to built-in functions.
4 { dg-options "-O2 -Warray-bounds=2 -Wno-stringop-overflow -ftrack-macro-expansion=0" } */
6 #include "../gcc.dg/range.h"
9 # define restrict __restrict
13 extern void* memcpy (void* restrict
, const void* restrict
, size_t);
14 extern void* mempcpy (void* restrict
, const void* restrict
, size_t);
15 extern void* memmove (void*, const void*, size_t);
17 extern char* stpcpy (char* restrict
, const char* restrict
);
19 extern char* strcat (char* restrict
, const char* restrict
);
20 extern char* strcpy (char* restrict
, const char* restrict
);
21 extern char* strncpy (char* restrict
, const char* restrict
, size_t);
27 struct MA
{ char a5
[5], a7
[7]; };
29 void sink (void*, ...);
31 void test_memcpy_bounds_memarray_range (void)
34 #define TM(mem, dst, src, n) \
37 sink (&ma); /* Initialize arrays. */ \
38 memcpy (dst, src, n); \
42 ptrdiff_t j
= SR (1, 2);
44 TM (ma
.a5
, ma
.a5
+ j
, ma
.a5
, 1);
45 TM (ma
.a5
, ma
.a5
+ j
, ma
.a5
, 3);
47 /* The copy below is invalid for two reasons: 1) it overlaps and 2) it
48 writes past the end of ma.a5. The warning is a little cryptic here
49 because the GIMPLE is:
50 _4 = &ma.a5 + prephitmp_14;
51 MEM <unsigned char[5]> [(char * {ref-all})_4]
52 = MEM <unsigned char[5]> [(char * {ref-all})&ma];
53 and could be improved. Just verify that one is issued but not its
55 TM (ma
.a5
, ma
.a5
+ j
, ma
.a5
, 5); /* { dg-warning "\\\[-Warray-bounds" "pr101374" { xfail *-*-* } } */
57 TM (ma
.a5
, ma
.a5
+ j
, ma
.a5
, 7); /* { dg-warning "offset \\\[5, 7] from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]. at offset 0" } */
58 TM (ma
.a5
, ma
.a5
+ j
, ma
.a5
, 9); /* { dg-warning "offset \\\[5, 9] from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]. at offset 0" } */
61 #if __i386__ || __x86_64__
63 /* Disabled for non-x86 targets due to bug 83543. */
65 void test_strcpy_bounds_memarray_range (void)
68 #define TM(a5init, a7init, dst, src) \
70 struct MA ma = { a5init, a7init }; \
75 ptrdiff_t i
= SR (1, 2);
77 TM ("0", "", ma
.a5
+ i
, ma
.a5
);
78 TM ("01", "", ma
.a5
+ i
, ma
.a5
);
79 TM ("012", "", ma
.a5
+ i
, ma
.a5
);
80 TM ("0123", "", ma
.a5
+ i
, ma
.a5
); /* { dg-warning "offset 5 from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char *\\\[5]. at offset 0" "pr83543" { xfail { ! { i?86-*-* x86_64-*-* } } } } */
82 TM ("", "012345", ma
.a7
+ i
, ma
.a7
); /* { dg-warning "offset 12 from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a7. with type .char ?\\\[7]. at offset 5" "pr83543" { xfail { ! { i?86-*-* x86_64-*-* } } } } */