blob: 2bd25ca30fa34d1f134a86f1515d8f8d6615e371 [file] [log] [blame]
Balázs Kéri11bd3e52020-04-08 08:52:24 +02001// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-checker=debug.StreamTester,debug.ExprInspection -analyzer-store region -verify %s
2
3#include "Inputs/system-header-simulator.h"
4
5void clang_analyzer_eval(int);
6void StreamTesterChecker_make_feof_stream(FILE *);
7void StreamTesterChecker_make_ferror_stream(FILE *);
8
9void error_fopen() {
10 FILE *F = fopen("file", "r");
11 if (!F)
12 return;
13 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
14 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
15 fclose(F);
16}
17
18void error_freopen() {
19 FILE *F = fopen("file", "r");
20 if (!F)
21 return;
22 F = freopen(0, "w", F);
23 if (!F)
24 return;
25 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
26 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
27 fclose(F);
28}
29
30void stream_error_feof() {
31 FILE *F = fopen("file", "r");
32 if (!F)
33 return;
34 StreamTesterChecker_make_feof_stream(F);
35 clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}}
36 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
37 clearerr(F);
38 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
39 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
40 fclose(F);
41}
42
43void stream_error_ferror() {
44 FILE *F = fopen("file", "r");
45 if (!F)
46 return;
47 StreamTesterChecker_make_ferror_stream(F);
48 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
49 clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}
50 clearerr(F);
51 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
52 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
53 fclose(F);
54}
Balázs Kérif2b5e60d2020-04-14 11:14:17 +020055
56void error_fseek() {
57 FILE *F = fopen("file", "r");
58 if (!F)
59 return;
60 int rc = fseek(F, 0, SEEK_SET);
61 if (rc) {
62 int IsFEof = feof(F), IsFError = ferror(F);
63 // Get feof or ferror or no error.
64 clang_analyzer_eval(IsFEof || IsFError);
65 // expected-warning@-1 {{FALSE}}
66 // expected-warning@-2 {{TRUE}}
67 clang_analyzer_eval(IsFEof && IsFError); // expected-warning {{FALSE}}
68 // Error flags should not change.
69 if (IsFEof)
70 clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}}
71 else
72 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
73 if (IsFError)
74 clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}
75 else
76 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
77 } else {
78 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
79 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
80 // Error flags should not change.
81 clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
82 clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
83 }
84 fclose(F);
85}