1 /* Exercise that -Warray-bounds is issued for out-of-bounds offsets
2    in calls to built-in functions.
3    { dg-do compile }
4    { dg-options "-O2 -Warray-bounds=2 -Wno-stringop-overflow -ftrack-macro-expansion=0" }  */
5 
6 #include "../gcc.dg/range.h"
7 
8 #if __cplusplus
9 #  define restrict __restrict
10 extern "C" {
11 #endif
WindowSurfaceX11SHM(Display * aDisplay,Drawable aWindow,Visual * aVisual,unsigned int aDepth)12 
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);
16 
17 extern char* stpcpy (char* restrict, const char* restrict);
18 
19 extern char* strcat (char* restrict, const char* restrict);
Lock(const LayoutDeviceIntRegion & aRegion)20 extern char* strcpy (char* restrict, const char* restrict);
21 extern char* strncpy (char* restrict, const char* restrict, size_t);
22 
23 #if __cplusplus
24 }   /* extern "C" */
25 #endif
26 
Commit(const LayoutDeviceIntRegion & aInvalidRegion)27 struct MA { char a5[5], a7[7]; };
28 
29 void sink (void*, ...);
30 
31 void test_memcpy_bounds_memarray_range (void)
32 {
33 #undef TM
34 #define TM(mem, dst, src, n)			\
35   do {						\
36     struct MA ma;				\
37     sink (&ma);   /* Initialize arrays.  */	\
38     memcpy (dst, src, n);			\
39     sink (&ma);					\
40   } while (0)
41 
42   ptrdiff_t j = SR (1, 2);
43 
44   TM (ma.a5, ma.a5 + j, ma.a5, 1);
45   TM (ma.a5, ma.a5 + j, ma.a5, 3);
46   TM (ma.a5, ma.a5 + j, ma.a5, 5);
47   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" } */
48   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" } */
49 }
50 
51 #if __i386__ || __x86_64__
52 
53 /* Disabled for non-x86 targets due to bug 83543.  */
54 
55 void test_strcpy_bounds_memarray_range (void)
56 {
57 #undef TM
58 #define TM(a5init, a7init, dst, src)		\
59   do {						\
60     struct MA ma = { a5init, a7init };		\
61     strcpy (dst, src);				\
62     sink (&ma);					\
63   } while (0)
64 
65   ptrdiff_t i = SR (1, 2);
66 
67   TM ("0", "",     ma.a5 + i, ma.a5);
68   TM ("01", "",    ma.a5 + i, ma.a5);
69   TM ("012", "",   ma.a5 + i, ma.a5);
70   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-*-* } } } } */
71 
72   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-*-* } } } } */
73 }
74 #endif
75