1 // RUN: %clang_analyze_cc1 -verify %s \
2 // RUN: -analyzer-checker=core \
3 // RUN: -analyzer-checker=unix.Errno \
4 // RUN: -analyzer-checker=unix.Stream \
5 // RUN: -analyzer-checker=unix.StdCLibraryFunctions \
6 // RUN: -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true \
7 // RUN: -analyzer-checker=debug.ExprInspection
8
9 // enable only StdCLibraryFunctions checker
10 // RUN: %clang_analyze_cc1 -verify %s \
11 // RUN: -analyzer-checker=core \
12 // RUN: -analyzer-checker=unix.Errno \
13 // RUN: -analyzer-checker=unix.StdCLibraryFunctions \
14 // RUN: -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true \
15 // RUN: -analyzer-checker=debug.ExprInspection
16
17 #include "Inputs/system-header-simulator.h"
18 #include "Inputs/errno_var.h"
19
20 void clang_analyzer_eval(int);
21
22 const char *WBuf = "123456789";
23 char RBuf[10];
24
test_freopen(FILE * F)25 void test_freopen(FILE *F) {
26 F = freopen("xxx", "w", F);
27 if (F) {
28 if (errno) {} // expected-warning{{undefined}}
29 } else {
30 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
31 }
32 }
33
test_fread(FILE * F)34 void test_fread(FILE *F) {
35 size_t Ret = fread(RBuf, 1, 10, F);
36 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
37 if (Ret == 10) {
38 if (errno) {} // expected-warning{{undefined}}
39 } else {
40 clang_analyzer_eval(Ret < 10); // expected-warning {{TRUE}}
41 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
42 }
43 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
44 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
45 }
46
test_fwrite(FILE * F)47 void test_fwrite(FILE *F) {
48 size_t Ret = fwrite(WBuf, 1, 10, F);
49 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
50 if (Ret == 10) {
51 if (errno) {} // expected-warning{{undefined}}
52 } else {
53 clang_analyzer_eval(Ret < 10); // expected-warning {{TRUE}}
54 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
55 }
56 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
57 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
58 }
59
test_fgetc(FILE * F)60 void test_fgetc(FILE *F) {
61 int Ret = fgetc(F);
62 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
63 if (Ret != EOF) {
64 if (errno) {} // expected-warning {{undefined}}
65 } else {
66 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
67 // expected-warning@-1 {{FALSE}}
68 }
69 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
70 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
71 }
72
test_fputc(FILE * F)73 void test_fputc(FILE *F) {
74 int Ret = fputc('a', F);
75 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
76 if (Ret != EOF) {
77 clang_analyzer_eval(Ret == 'a'); // expected-warning {{TRUE}}
78 if (errno) {} // expected-warning {{undefined}}
79 } else {
80 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
81 }
82 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
83 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
84 }
85
test_fgets(char * Buf,int N,FILE * F)86 void test_fgets(char *Buf, int N, FILE *F) {
87 char *Ret = fgets(Buf, N, F);
88 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
89 clang_analyzer_eval(Buf != NULL); // expected-warning {{TRUE}}
90 clang_analyzer_eval(N >= 0); // expected-warning {{TRUE}}
91 if (Ret == Buf) {
92 if (errno) {} // expected-warning {{undefined}}
93 } else {
94 clang_analyzer_eval(Ret == 0); // expected-warning {{TRUE}}
95 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
96 // expected-warning@-1 {{FALSE}}
97 }
98 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
99 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
100
101 char Buf1[10];
102 Ret = fgets(Buf1, 11, F); // expected-warning {{The 1st argument to 'fgets' is a buffer with size 10}}
103 }
104
test_fgets_bufsize(FILE * F)105 void test_fgets_bufsize(FILE *F) {
106 char Buf[10];
107 fgets(Buf, 11, F); // expected-warning {{The 1st argument to 'fgets' is a buffer with size 10}}
108 }
109
test_fputs(char * Buf,FILE * F)110 void test_fputs(char *Buf, FILE *F) {
111 int Ret = fputs(Buf, F);
112 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
113 clang_analyzer_eval(Buf != NULL); // expected-warning {{TRUE}}
114 if (Ret >= 0) {
115 if (errno) {} // expected-warning {{undefined}}
116 } else {
117 clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}
118 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
119 }
120 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
121 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
122 }
123
test_ungetc(FILE * F)124 void test_ungetc(FILE *F) {
125 int Ret = ungetc('X', F);
126 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
127 if (Ret == 'X') {
128 if (errno) {} // expected-warning {{undefined}}
129 } else {
130 clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}
131 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
132 }
133 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
134 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
135 }
136
test_ungetc_EOF(FILE * F,int C)137 void test_ungetc_EOF(FILE *F, int C) {
138 int Ret = ungetc(EOF, F);
139 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
140 clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}
141 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
142 Ret = ungetc(C, F);
143 if (Ret == EOF) {
144 clang_analyzer_eval(C == EOF); // expected-warning {{TRUE}}
145 // expected-warning@-1{{FALSE}}
146 }
147 }
148
test_fclose(FILE * F)149 void test_fclose(FILE *F) {
150 int Ret = fclose(F);
151 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
152 if (Ret == 0) {
153 if (errno) {} // expected-warning{{undefined}}
154 } else {
155 clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}
156 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
157 }
158 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
159 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
160 }
161
test_fseek(FILE * F)162 void test_fseek(FILE *F) {
163 int Ret = fseek(F, SEEK_SET, 1);
164 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
165 if (Ret == 0) {
166 if (errno) {} // expected-warning{{undefined}}
167 } else {
168 clang_analyzer_eval(Ret == -1); // expected-warning {{TRUE}}
169 clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}
170 }
171 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
172 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
173 }
174
check_fgetpos(FILE * F)175 void check_fgetpos(FILE *F) {
176 errno = 0;
177 fpos_t Pos;
178 int Ret = fgetpos(F, &Pos);
179 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
180 if (Ret)
181 clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
182 else
183 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
184 // expected-warning@-1{{FALSE}}
185 if (errno) {} // no-warning
186 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
187 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
188 }
189
check_fsetpos(FILE * F)190 void check_fsetpos(FILE *F) {
191 errno = 0;
192 fpos_t Pos;
193 int Ret = fsetpos(F, &Pos);
194 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
195 if (Ret)
196 clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
197 else
198 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
199 // expected-warning@-1{{FALSE}}
200 if (errno) {} // no-warning
201 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
202 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
203 }
204
check_ftell(FILE * F)205 void check_ftell(FILE *F) {
206 errno = 0;
207 long Ret = ftell(F);
208 clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}
209 if (Ret == -1) {
210 clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
211 } else {
212 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
213 // expected-warning@-1{{FALSE}}
214 clang_analyzer_eval(Ret >= 0); // expected-warning{{TRUE}}
215 }
216 if (errno) {} // no-warning
217 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
218 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
219 }
220
test_rewind(FILE * F)221 void test_rewind(FILE *F) {
222 errno = 0;
223 rewind(F);
224 clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}
225 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
226 // expected-warning@-1{{FALSE}}
227 rewind(F);
228 }
229
test_fflush(FILE * F)230 void test_fflush(FILE *F) {
231 errno = 0;
232 int Ret = fflush(F);
233 clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}
234 // expected-warning@-1{{FALSE}}
235 if (Ret == EOF) {
236 clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}
237 } else {
238 clang_analyzer_eval(Ret == 0); // expected-warning{{TRUE}}
239 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
240 // expected-warning@-1{{FALSE}}
241 }
242 }
243
test_feof(FILE * F)244 void test_feof(FILE *F) {
245 errno = 0;
246 feof(F);
247 clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}
248 if (errno) {} // no-warning
249 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
250 // expected-warning@-1{{FALSE}}
251 }
252
test_ferror(FILE * F)253 void test_ferror(FILE *F) {
254 errno = 0;
255 ferror(F);
256 clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}
257 if (errno) {} // no-warning
258 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
259 // expected-warning@-1{{FALSE}}
260 }
261
test_clearerr(FILE * F)262 void test_clearerr(FILE *F) {
263 errno = 0;
264 clearerr(F);
265 clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}
266 if (errno) {} // no-warning
267 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
268 // expected-warning@-1{{FALSE}}
269 }
270
test_fileno(FILE * F)271 void test_fileno(FILE *F) {
272 errno = 0;
273 int A = fileno(F);
274 clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}
275 clang_analyzer_eval(A >= 0); // expected-warning{{TRUE}}
276 if (errno) {} // no-warning
277 clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}
278 // expected-warning@-1{{FALSE}}
279 }
280
freadwrite_zerosize(FILE * F)281 void freadwrite_zerosize(FILE *F) {
282 fwrite(WBuf, 1, 0, F);
283 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
284 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
285 fwrite(WBuf, 0, 1, F);
286 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
287 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
288 fread(RBuf, 1, 0, F);
289 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
290 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
291 fread(RBuf, 0, 1, F);
292 clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}
293 clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}
294 }
295
freadwrite_zerosize_errno(FILE * F,int A)296 void freadwrite_zerosize_errno(FILE *F, int A) {
297 switch (A) {
298 case 1:
299 fwrite(WBuf, 1, 0, F);
300 if (errno) {} // expected-warning{{undefined}}
301 break;
302 case 2:
303 fwrite(WBuf, 0, 1, F);
304 if (errno) {} // expected-warning{{undefined}}
305 break;
306 case 3:
307 fread(RBuf, 1, 0, F);
308 if (errno) {} // expected-warning{{undefined}}
309 break;
310 case 4:
311 fread(RBuf, 0, 1, F);
312 if (errno) {} // expected-warning{{undefined}}
313 break;
314 }
315 }
316