annotate gcc/testsuite/c-c++-common/Warray-bounds-3.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 -Wno-stringop-overflow -Warray-bounds -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 void sink (void*, ...);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 #define CAT(x, y) x ## y
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 #define CONCAT(x, y) CAT (x, y)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 #define UNIQUE_NAME(x) CONCAT(x, __LINE__)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 #define T(type, N, dst, src, n) do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 extern type UNIQUE_NAME (a)[N]; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 type *a = UNIQUE_NAME (a); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 type *pd = (dst); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 const type *ps = (src); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 FUNC (pd, ps, n); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 sink (a, pd, ps); \
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
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 void test_memcpy_bounds (char *d, const char *s, size_t n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 #define FUNC memcpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 /* Verify that invalid offsets into an array of known size are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 detected. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 T (char, 1, a + SR (DIFF_MIN, -1), s, n); /* { dg-warning "offset \\\[-\[0-9\]+, -1] is out of the bounds \\\[0, 1] of object \[^\n\r]* with type .char ?\\\[1]" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 T (char, 1, a + SR (-2, -1), s, n); /* { dg-warning "offset \\\[-2, -1] is out of the bounds \\\[0, 1] of object" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 T (char, 1, a + SR (-2, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 T (char, 1, a + UR (0, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 T (char, 1, a + UR (0, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 T (char, 1, a + UR (1, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 T (char, 1, a + UR (2, 3), s, n); /* { dg-warning "offset \\\[2, 3] is out of the bounds \\\[0, 1] of object " } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 T (char, 1, a + UR (2, DIFF_MAX), s, n); /* { dg-warning "offset \\\[2, \[0-9\]+] is out of the bounds \\\[0, 1] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 /* Offsets in excess of DIFF_MAX are treated as negative even if
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 they appear as large positive in the source. It would be nice
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 if they retained their type but unfortunately that's not how
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 it works so be prepared for both in case it even gets fixed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 T (char, 1, a + UR (3, SIZE_MAX - 1), s, n); /* { dg-warning "offset \\\[3, -?\[0-9\]+] is out of the bounds \\\[0, 1] of object" "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 /* Verify that invalid offsets into an array of unknown size are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 detected. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 extern char arr[];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 T (char, 1, arr + SR (DIFF_MIN, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 T (char, 1, arr + SR (DIFF_MIN + 1, -1), s, n); /* { dg-warning "offset \\\[-\[0-9\]+, -1] is out of the bounds of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 T (char, 1, arr + SR (DIFF_MIN, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 T (char, 1, arr + SR (DIFF_MIN, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 T (char, 1, arr + SR ( -2, -1), s, n); /* { dg-warning "offset \\\[-2, -1] is out of the bounds of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 T (char, 1, arr + SR ( -1, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 T (char, 1, arr + SR ( -1, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 T (char, 1, arr + SR ( -1, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 T (char, 1, arr + SR ( 0, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 T (char, 1, arr + SR ( 0, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 T (char, 1, arr + SR ( 1, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 T (char, 1, arr + SR ( 1, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 /* Verify that all offsets via a pointer to an uknown object are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 accepted. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 /* Negative indices between [DIFF_MIN, DIFF_MAX] are valid since
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 the pointer to which the offset is applied can be at a positive
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 offset from the beginning of an object. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 T (char, 1, d + SR (DIFF_MIN, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 T (char, 1, d + SR (DIFF_MIN, -1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 T (char, 1, d + SR (DIFF_MIN, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 T (char, 1, d + SR (DIFF_MIN, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 T (char, 1, d + SR ( -2, -1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 T (char, 1, d + SR ( -1, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 T (char, 1, d + SR ( -1, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 T (char, 1, d + SR ( -1, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 T (char, 1, d + SR ( 0, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 T (char, 1, d + SR ( 0, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 T (char, 1, d + SR ( 1, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 T (char, 1, d + SR ( 1, DIFF_MAX - 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 /* Verify offsets in an anti-range. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 void test_memcpy_bounds_anti_range (char *d, const char *s, size_t n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 T (char, 9, a, a + SAR (-2, -1), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 T (char, 9, a, a + SAR (-1, 1), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 T (char, 9, a, a + SAR ( 0, 1), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 T (char, 9, a, a + SAR ( 0, 2), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 T (char, 9, a, a + SAR ( 0, 3), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 T (char, 9, a, a + SAR ( 0, 4), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 T (char, 9, a, a + SAR ( 0, 5), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 /* The initial source range is valid but the final range after the access
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 has complete cannot be. The value mentioned in the warning is the final
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 offset, i.e., 7 + 3. Including the whole final range because would be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 confusing (the upper bound would either be negative or a very large
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 positive number) so only the lower bound is included. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 T (char, 9, a, a + SAR ( 0, 6), 3); /* { dg-warning "forming offset 10 is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 /* This fails because the offset isn't represented as an SSA_NAME
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 but rather as a GIMPLE_PHI (offset, 0). With some effort it is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 possible to extract the range from the PHI but it's not implemented
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 (yet). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 T (char, 9, a, a + SAR ( 1, 6), 3); /* { dg-warning "forming offset \\\[9, 0] is out of the bounds \\\[0, 9] of object " "memcpy" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 /* The range of offsets is the union of [0, 1] and [7, PTRDIFF_MAX]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 of which the first subrange is valid and thus no warming for memcpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 is issued. Similarly for the next test. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 T (char, 9, a, a + SAR ( 2, 6), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 T (char, 9, a, a + SAR ( 3, 6), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 T (char, 9, a, a + SAR (-1, 7), 3); /* { dg-warning "forming offset \\\[10, 11] is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 T (char, 9, a, a + SAR (-2, 8), 3); /* { dg-warning "forming offset \\\[10, 12] is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 T (char, 9, a, a + SAR (-3, 7), 5); /* { dg-warning "forming offset \\\[10, 13] is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 T (char, 9, a + SAR (-2, -1), a, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 T (char, 9, a + SAR (-1, 1), a, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 T (char, 9, a + SAR ( 0, 1), a, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 T (char, 9, a + SAR ( 0, 2), a, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 T (char, 9, a + SAR ( 0, 3), a, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 T (char, 9, a + SAR ( 0, 6), a, 3); /* { dg-warning "forming offset 10 is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 T (char, 9, a + SAR (-1, 7), a, 3); /* { dg-warning "forming offset \\\[10, 11] is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 T (char, 9, a + SAR (-2, 8), a, 3); /* { dg-warning "forming offset \\\[10, 12] is out of the bounds \\\[0, 9] of object " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 ptrdiff_t i = SAR (DIFF_MIN + 1, DIFF_MAX - 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 T (char, 1, d, d + SAR (DIFF_MIN + 3, DIFF_MAX - 1), 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 T (char, 1, d, d + SAR (DIFF_MIN + 3, DIFF_MAX - 3), 5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 /* Verify that pointer overflow in the computation done by memcpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 (i.e., offset + size) is detected and diagnosed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 void test_memcpy_overflow (char *d, const char *s, size_t n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 extern char arr[];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 /* Verify that offset overflow involving an array of unknown size
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 but known access size is detected. This works except with small
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 sizes that are powers of 2 due to bug . */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 T (char, 1, arr + SR (DIFF_MAX - 1, DIFF_MAX), s, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 T (char, 1, arr + SR (DIFF_MAX - 1, DIFF_MAX), s, 2); /* { dg-warning "pointer overflow between offset \\\[\[0-9\]+, \[0-9\]+] and size 2 accessing array " "bug " { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 T (char, 1, arr + SR (DIFF_MAX - 2, DIFF_MAX), s, 3); /* { dg-warning "pointer overflow between offset \\\[\[0-9\]+, \[0-9\]+] and size 3 accessing array " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 T (char, 1, arr + SR (DIFF_MAX - 4, DIFF_MAX), s, 5); /* { dg-warning "pointer overflow between offset \\\[\[0-9\]+, \[0-9\]+] and size 5 accessing array " "memcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 void test_memcpy_bounds_memarray_range (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 #undef TM
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 #define TM(mem, dst, src, n) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 struct MA { char a5[5]; int i; } ma; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 sink (&ma); /* Initialize arrays. */ \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 memcpy (dst, src, n); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 sink (&ma); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 ptrdiff_t i = SR (1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 TM (ma.a5, ma.a5 + i, ma.a5, 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180 TM (ma.a5, ma.a5 + i, ma.a5, 3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181 TM (ma.a5, ma.a5 + i, ma.a5, 5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 TM (ma.a5, ma.a5 + i, ma.a5, 7); /* diagnosed with -Warray-bounds=2 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 void test_memmove_bounds (char *d, const char *s, size_t n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 #undef FUNC
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188 #define FUNC memmove
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 T (char, 1, a + SR (DIFF_MIN + 1, -1), s, n); /* { dg-warning "offset \\\[-\[0-9\]+, -1] is out of the bounds \\\[0, 1] of object \[^\n\r]+ with type .char ?\\\[1]" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 T (char, 1, a + SR (-2, -1), s, n); /* { dg-warning "offset \\\[-2, -1] is out of the bounds \\\[0, 1] of object" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192 T (char, 1, a + SR (-2, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 const int *pi = (const int*)s;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195 T (int, 2, a + SR (-1, 1), pi, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 T (int, 2, a + SR (-1, 2), pi, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 T (int, 2, a + SR ( 0, 2), pi, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 T (int, 2, a + SR ( 0, 3), pi, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199 T (int, 2, a + SR ( 1, 3), pi, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 T (int, 2, a + SR ( 2, 3), pi, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 const int32_t *pi32 = (const int32_t*)s;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203 T (int32_t, 2, a + SR ( 3, 4), pi32, n); /* { dg-warning "offset \\\[12, 16] is out of the bounds \\\[0, 8] of object .\[^\n\r]+. with type .int32_t ?\\\[2]." } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207 void test_mempcpy_bounds (char *d, const char *s, size_t n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209 #undef FUNC
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 #define FUNC mempcpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 /* Verify that invalid offsets into an array of known size are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213 detected. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 T (char, 1, a + SR (DIFF_MIN, -1), s, n); /* { dg-warning "offset \\\[-\[0-9\]+, -1] is out of the bounds" "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 T (char, 1, a + SR (-2, -1), s, n); /* { dg-warning "offset \\\[-2, -1] is out of the bounds" "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 T (char, 1, a + SR (-2, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 T (char, 1, a + UR (0, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220 T (char, 1, a + UR (0, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 T (char, 1, a + UR (1, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 T (char, 1, a + UR (2, 3), s, n); /* { dg-warning "offset \\\[2, 3] is out of the bounds \\\[0, 1] of object " "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 T (char, 1, a + UR (2, DIFF_MAX), s, n); /* { dg-warning "offset \\\[2, \[0-9\]+] is out of the bounds \\\[0, 1] of object" "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225 /* Offsets in excess of DIFF_MAX are treated as negative even if
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 they appear as large positive in the source. It would be nice
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 if they retained their type but unfortunately that's not how
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228 it works so be prepared for both in case it ever gets fixed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 T (char, 1, a + UR (3, SIZE_MAX), s, n); /* { dg-warning "offset \\\[3, -?\[0-9\]+] is out of the bounds \\\[0, 1] of object " "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231 /* Verify that invalid offsets into an array of unknown size are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 detected. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 extern char arr[];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 T (char, 1, arr + SR (DIFF_MIN, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 T (char, 1, arr + SR (DIFF_MIN, -1), s, n); /* { dg-warning "offset \\\[-\[0-9\]+, -1] is out of the bounds of object" "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236 T (char, 1, arr + SR (DIFF_MIN, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 T (char, 1, arr + SR (DIFF_MIN, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 T (char, 1, arr + SR ( -2, -1), s, n); /* { dg-warning "offset \\\[-2, -1] is out of the bounds of object" "mempcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239 T (char, 1, arr + SR ( -1, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 T (char, 1, arr + SR ( -1, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 T (char, 1, arr + SR ( -1, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 T (char, 1, arr + SR ( 0, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243 T (char, 1, arr + SR ( 0, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 T (char, 1, arr + SR ( 1, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 T (char, 1, arr + SR ( 1, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 /* Verify that all offsets via a pointer to an uknown object are
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 accepted. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 /* Negative indices between [DIFF_MIN, DIFF_MAX] are valid since
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 the pointer to which the offset is applied can be at a positive
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 offset from the beginning of an object. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 T (char, 1, d + SR (DIFF_MIN, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 T (char, 1, d + SR (DIFF_MIN, -1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 T (char, 1, d + SR (DIFF_MIN, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 T (char, 1, d + SR (DIFF_MIN, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 T (char, 1, d + SR ( -2, -1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258 T (char, 1, d + SR ( -1, 0), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259 T (char, 1, d + SR ( -1, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260 T (char, 1, d + SR ( -1, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261 T (char, 1, d + SR ( 0, 1), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 T (char, 1, d + SR ( 0, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263 T (char, 1, d + SR ( 1, 2), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 T (char, 1, d + SR ( 1, DIFF_MAX), s, n);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267 #define TI(type, N, init, dst, src) do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268 type UNIQUE_NAME (a)[N] = init; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269 type *a = UNIQUE_NAME (a); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270 type *pd = (dst); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271 const type *ps = (src); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272 FUNC (pd, ps); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 sink (a, pd, ps, s); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 void test_strcpy_bounds (char *d, const char *s)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278 #undef FUNC
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 #define FUNC strcpy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281 ptrdiff_t i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283 TI (char, 1, "", a, a + SR (DIFF_MIN, 0));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284 TI (char, 1, "", a, a + SR (-1, 0));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 TI (char, 1, "", a, a + SR (-1, 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 TI (char, 1, "", a, a + SR (0, 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287 TI (char, 1, "", a, a + SR (0, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288 TI (char, 2, "0", a, a + SR (0, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289 TI (char, 2, "0", a, a + SR (1, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290 /* The following needs a warning for reading past the end. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291 TI (char, 2, "0", a, a + SR (2, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 TI (char, 2, "0", a, a + SR (3, DIFF_MAX - 1)); /* { dg-warning "offset \\\[3, \[0-9\]+] is out of the bounds \\\[0, 2] of object \[^\n\r\]+ with type .char ?\\\[2\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294 TI (char, 3, "01", a, a + SR (0, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 TI (char, 3, "01", a, a + SR (1, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296 TI (char, 3, "01", a, a + SR (2, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297 /* The following needs a warning for reading past the end. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 TI (char, 3, "01", a, a + SR (3, DIFF_MAX - 1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299 TI (char, 3, "01", a, a + SR (4, DIFF_MAX - 1)); /* { dg-warning "offset \\\[4, \[0-9\]+] is out of the bounds \\\[0, 3] of object \[^\n\r\]+ with type .char ?\\\[3\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301 TI (char, 4, "012", a, a + SR (DIFF_MAX - 2, DIFF_MAX - 1)); /* { dg-warning "offset \\\[\[0-9\]+, \[0-9\]+] is out of the bounds \\\[0, 4] of object \[^\n\r\]+ with type .char ?\\\[4\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304 TI (char, 1, "", a + SR (DIFF_MIN, 0), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305 TI (char, 1, "", a + SR (-1, 0), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 TI (char, 1, "", a + SR (-1, 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 TI (char, 1, "", a + SR (0, 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 TI (char, 1, "", a + SR (0, DIFF_MAX - 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309 TI (char, 2, "", a + SR (0, DIFF_MAX - 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310 TI (char, 2, "", a + SR (1, DIFF_MAX - 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311 /* The following is diagnosed not because the initial source offset
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312 it out of bounds (it isn't) but because the final source offset
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313 after the access has completed, is. It would be clearer if
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 the warning mentioned the final offset. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315 TI (char, 2, "", a + SR (2, DIFF_MAX - 1), s); /* { dg-warning "forming offset 3 is out of the bounds \\\[0, 2] of object \[^\n\r\]+ with type .char ?\\\[2\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316 TI (char, 2, "", a + SR (3, DIFF_MAX - 1), s); /* { dg-warning "offset \\\[3, \[0-9\]+] is out of the bounds \\\[0, 2] of object \[^\n\r\]+ with type .char ?\\\[2\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318 TI (char, 3, "", a + SR (0, DIFF_MAX - 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319 TI (char, 3, "", a + SR (1, DIFF_MAX - 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 TI (char, 3, "", a + SR (2, DIFF_MAX - 1), s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 TI (char, 3, "", a + SR (3, DIFF_MAX - 1), s); /* { dg-warning "forming offset 4 is out of the bounds \\\[0, 3] of object \[^\n\r\]+ with type .char ?\\\[3\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 TI (char, 3, "", a + SR (4, DIFF_MAX - 1), s); /* { dg-warning "offset \\\[4, \[0-9\]+] is out of the bounds \\\[0, 3] of object \[^\n\r\]+ with type .char ?\\\[3\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 TI (char, 4, "", a + SR (DIFF_MAX - 2, DIFF_MAX - 1), s); /* { dg-warning "offset \\\[\[0-9\]+, \[0-9\]+] is out of the bounds \\\[0, 4] of object \[^\n\r\]+ with type .char ?\\\[4\\\]." "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 struct MA
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329 int i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 char a5[5];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 char a11[11];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334 struct MA2
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
336 struct MA ma3[3];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
337 struct MA ma5[5];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
338 char ax[];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
339 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
340
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
341 struct MA3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
342 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
343 struct MA2 ma5[3];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
344 struct MA2 ma7[7];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
345 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
346
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
347 void test_strcpy_bounds_memarray_range (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
348 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
349 #undef TM
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
350 #define TM(mem, init, dst, src) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
351 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
352 struct MA ma; \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
353 strcpy (ma.mem, init); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
354 strcpy (dst, src); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
355 sink (&ma); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
356 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
357
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
358 ptrdiff_t i = SR (1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
359
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
360 TM (a5, "0", ma.a5 + i, ma.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
361 TM (a5, "01", ma.a5 + i, ma.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
362 TM (a5, "012", ma.a5 + i, ma.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
363 TM (a5, "0123", ma.a5 + i, ma.a5); /* { dg-warning "offset 10 from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]. at offset 4" "strcpy" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
364
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
365 TM (a11, "0", ma.a5, ma.a11);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
366 TM (a11, "01", ma.a5, ma.a11);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
367 TM (a11, "012", ma.a5, ma.a11);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
368 TM (a11, "0123", ma.a5, ma.a11);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369 TM (a11, "01234", ma.a5, ma.a11); /* { dg-warning "offset 10 from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]' at offset 4" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
370 TM (a11, "012345", ma.a5, ma.a11); /* { dg-warning "offset \\\[10, 11] from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]' at offset 4" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
371 TM (a11, "0123456", ma.a5, ma.a11); /* { dg-warning "offset \\\[10, 12] from the object at .ma. is out of the bounds of referenced subobject .\(MA::\)?a5. with type .char ?\\\[5]' at offset 4" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
372
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
373 TM (a11, "0123456", ma.a11 + i, "789abcd");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
374 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
375
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
376 void test_strcpy_bounds_memarray_var (struct MA *pma,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
377 struct MA2 *pma2,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
378 struct MA3 *pma3,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
379 const char *s, size_t n)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
380 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
381 #undef TM
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
382 #define TM(dst, src) do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
383 strcpy (dst, src); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
384 sink (dst, src); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
385 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
386
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
387 TM (pma->a5, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
388 TM (pma->a5 + 0, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
389 TM (pma->a5 + 1, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
390 TM (pma->a5 + 4, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
391
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
392 /* The following forms a pointer during the call that's outside
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
393 the bounds of the array it was derived from (pma->a5) so
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
394 it should be diagnosed but the representation of the pointer
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
395 addition doesn't contain information to distinguish it from
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
396 the valid pma->a11 + 1 so this is an XFAIL. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
397 TM (pma->a5 + 5, s); /* { dg-warning "offset 17 from the object at .pma. is out of the bounds of .struct MA." "strcpy" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
398
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
399 /* The following also forms an out-of-bounds pointer but similar
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
400 to the above, there is no reliable way to distinguish it from
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
401 (char*)&pma[1].i + 1 so this too is not diagnosed. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
402 TM (pma->a5 + sizeof *pma + 1, s); /* { dg-warning "offset 17 from the object at .pma. is out of the bounds of .struct MA." "strcpy" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
403
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
404 TM (pma->a5 - 1, s); /* { dg-warning "offset -1 from the object at .pma. is out of the bounds of .struct MA." "strcpy" { xfail *-*-* } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
405
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
406 TM (pma[1].a5, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
407 TM (pma[2].a5 + 0, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
408 TM (pma[3].a5 + 1, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
409 TM (pma[4].a5 + 4, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
410
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
411
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
412 extern struct MA3 ma3[3];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
413 TM (ma3[0].ma5[0].ma3[0].a5 + 6, s);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
414 }