annotate gcc/testsuite/gcc.dg/Wstringop-overflow-23.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR middle-end/83859 - attribute to establish relation between parameters
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 for buffer and its size
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Test to verify that with optimization enabled, -Wstringop-overflow
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 warnings are issued for calls to user-defined functions with attribute
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 access and with non-constant out-of-bounds arguments.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 { dg-do compile }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 { dg-options "-O2 -Wall" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 #include "range.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 #define INT_MAX __INT_MAX__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 #define INT_MIN (-INT_MAX - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #define RDONLY(...) __attribute__ ((access (read_only, __VA_ARGS__)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #define WRONLY(...) __attribute__ ((access (write_only, __VA_ARGS__)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #define RDWR(...) __attribute__ ((access (read_write, __VA_ARGS__)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 typedef __INT32_TYPE__ int32_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 /* Exercise null pointer detection. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 RDONLY (2, 1) void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 rd2_1 (int, const void*); // { dg-message "in a call to function 'rd2_1' declared with attribute 'read_only \\\(2, 1\\\)" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 void test_rd2_1 (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 void *null = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 void *p = &null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 rd2_1 (0, null);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 rd2_1 (1, p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 void *null = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 rd2_1 (1, null); // { dg-warning "argument 2 is null but the corresponding size argument 1 value is 1" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 void *null = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 rd2_1 (SR (1, 2), null); // { dg-warning "argument 2 is null but the corresponding size argument 1 range is \\\[1, 2]" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 WRONLY (3, 1) void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 wr3_1 (int, int, void*); // { dg-message "in a call to function 'wr3_1' declared with attribute 'write_only \\\(3, 1\\\)" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 void test_wr3_1 (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 void *null = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 void *p = &null;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 wr3_1 (SR (0, 1), 0, null);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 wr3_1 (SR (1, 1), 0, p);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 void *null = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 wr3_1 (SR (1, 2), 1, null); // { dg-warning "argument 3 is null but the corresponding size argument 1 range is \\\[1, 2]" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 WRONLY (2, 1) void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 wr2_1 (int, void*);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 void test_wrd2_1 (int n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 wr2_1 (0, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 wr2_1 (SR (-1, 1), 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 wr2_1 (SR (0, 1), 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 wr2_1 (SR (1, 2), 0); // { dg-warning "argument 2 is null but the corresponding size argument 1 range is \\\[1, 2]" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 /* This should probably be diagnosed but to avoid false positives
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 caused by jump threading and such it would have to be done
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 earlier than it is now. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 wr2_1 (n, 0); // { dg-warning "argument 2 is null" "unimplemented" { xfail *-*-* } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 /* Exercise pointer to an incomplete type other than void. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 struct Incomplete;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 extern struct Incomplete inc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 extern char ax[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 WRONLY (1, 2) void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 wr1_2_inc (struct Incomplete*, unsigned);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 void test_wr1_2_inc (struct Incomplete *pinc, unsigned n)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 wr1_2_inc (0, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 wr1_2_inc (0, 1); // { dg-warning "argument 1 is null but the corresponding size argument 2 value is 1" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 wr1_2_inc (pinc, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 wr1_2_inc (&inc, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 wr1_2_inc (pinc, 123);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 wr1_2_inc (&inc, 456);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 char a3[3];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 pinc = (struct Incomplete*)a3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 wr1_2_inc (pinc, SR (3, 4));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 wr1_2_inc (pinc, SR (4, 5));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 // { dg-warning "'wr1_2_inc' writing between 4 and 5 bytes into a region of size 3" "small buffer cast to incomplete" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 pinc = (struct Incomplete*)ax;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 wr1_2_inc (pinc, SR (123, 456));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 char vla[n];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 pinc = (struct Incomplete*)vla;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 wr1_2_inc (pinc, SR (345, 456));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 RDONLY (1, 3) WRONLY (2, 4) void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 rd1_3_wr2_4 (const void*, void*, int, int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 void test_rd1_3_wr2_4 (const void *s, void *d, int n1, int n2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 rd1_3_wr2_4 (s, d, 1, 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 rd1_3_wr2_4 (s, d, 123, 456);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 rd1_3_wr2_4 (s, d, INT_MAX, INT_MAX);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 rd1_3_wr2_4 (s, d, -1, 2); // { dg-warning "argument 3 value -1 is negative" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 const int ir_min_m1 = SR (INT_MIN, -1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 rd1_3_wr2_4 (s, d, ir_min_m1, 2); // { dg-warning "argument 3 range \\\[-\[0-9\]+, -1] is negative" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 rd1_3_wr2_4 (s, d, SR (-1, 0), 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 rd1_3_wr2_4 (s, d, SR (INT_MIN, INT_MAX), 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 rd1_3_wr2_4 (s, d, n1, n2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 const char s11[11] = "0123456789";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 rd1_3_wr2_4 (s11, d, 11, n2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 rd1_3_wr2_4 (s11, d, 12, n2); // { dg-warning "'rd1_3_wr2_4' reading 12 bytes from a region of size 11" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 rd1_3_wr2_4 (s11, d, SR (0, 11), n2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 rd1_3_wr2_4 (s11, d, SR (0, 12), n2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 rd1_3_wr2_4 (s11, d, SR (11, 12), n2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 rd1_3_wr2_4 (s11, d, SR (11, INT_MAX), n2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 rd1_3_wr2_4 (s11, d, SR (12, 13), n2); // { dg-warning "'rd1_3_wr2_4' reading between 12 and 13 bytes from a region of size 11" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 char d4[4];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 rd1_3_wr2_4 (s, d4, n1, 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 rd1_3_wr2_4 (s, d4, n1, 5); // { dg-warning "'rd1_3_wr2_4' writing 5 bytes into a region of size 4" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 rd1_3_wr2_4 (s11, d4, SR (12, 13), SR (5, 6));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 // { dg-warning "'rd1_3_wr2_4' reading between 12 and 13 bytes from a region of size 11" "read" { target *-*-* } .-1 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 // { dg-warning "'rd1_3_wr2_4' writing between 5 and 6 bytes into a region of size 4" "read" { target *-*-* } .-2 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 /* Verify that function pointers are handled. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 RDONLY (1) void (*pfrd1)(const void*, const void*);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 void test_pfrd1 (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 pfrd1 ("" + SR (0, 9), "" + SR (1, 9));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 pfrd1 ("" + SR (1, 2), ""); // { dg-warning "reading 1 byte from a region of size 0" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 WRONLY (4, 3) void (*pfwr4_3)(int, const char*, int, int32_t*);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 void test_pfwr4_3 (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 int32_t i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 pfwr4_3 (3, "", 0, &i + SR (0, 9));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 pfwr4_3 (5, "", 1, &i + SR (1, 2)); // { dg-warning "writing 4 bytes into a region of size 0" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 }