annotate gcc/testsuite/c-c++-common/Warray-bounds-4.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* Exercise that -Warray-bounds is issued for out-of-bounds offsets
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 in calls to built-in functions.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 { dg-options "-O2 -Warray-bounds=2 -Wno-stringop-overflow -ftrack-macro-expansion=0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 #include "../gcc.dg/range.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 #if __cplusplus
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 # define restrict __restrict
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 extern "C" {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 extern void* memcpy (void* restrict, const void* restrict, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 extern void* mempcpy (void* restrict, const void* restrict, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 extern void* memmove (void*, const void*, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 extern char* stpcpy (char* restrict, const char* restrict);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 extern char* strcat (char* restrict, const char* restrict);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 extern char* strcpy (char* restrict, const char* restrict);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 extern char* strncpy (char* restrict, const char* restrict, size_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 #if __cplusplus
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 } /* extern "C" */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 struct MA { char a5[5], a7[7]; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 void sink (void*, ...);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 void test_memcpy_bounds_memarray_range (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 #undef TM
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 #define TM(mem, dst, src, n) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 struct MA ma; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 sink (&ma); /* Initialize arrays. */ \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 memcpy (dst, src, n); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 sink (&ma); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 ptrdiff_t j = SR (1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 TM (ma.a5, ma.a5 + j, ma.a5, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 TM (ma.a5, ma.a5 + j, ma.a5, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 TM (ma.a5, ma.a5 + j, ma.a5, 5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 TM (ma.a5, ma.a5 + j, ma.a5, 7); /* { dg-warning "offset \\\[6, 8] from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]. at offset 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 TM (ma.a5, ma.a5 + j, ma.a5, 9); /* { dg-warning "offset \\\[6, 10] from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]. at offset 0" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 void test_strcpy_bounds_memarray_range (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 #undef TM
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 #define TM(a5init, a7init, dst, src) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 struct MA ma = { a5init, a7init }; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 strcpy (dst, src); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 sink (&ma); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 ptrdiff_t i = SR (1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 TM ("0", "", ma.a5 + i, ma.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 TM ("01", "", ma.a5 + i, ma.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 TM ("012", "", ma.a5 + i, ma.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 TM ("0123", "", ma.a5 + i, ma.a5); /* { dg-warning "offset 6 from the object at .ma. is out of the bounds of referenced subobject .a5. with type .char\\\[5]. at offset 0" "strcpy" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 #if __i386__ || __x86_64__
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 /* Disabled for non-x86 targets due to bug 83462. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 TM ("", "012345", ma.a7 + i, ma.a7); /* { dg-warning "offset 13 from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a7. with type .char ?\\\[7]. at offset 5" "strcpy" { xfail { ! { i?86-*-* x86_64-*-* } } } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 }