1 // 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 
5 void clang_analyzer_eval(int);
6 void StreamTesterChecker_make_feof_stream(FILE *);
7 void StreamTesterChecker_make_ferror_stream(FILE *);
8 
9 void 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 
18 void 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 
30 void 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 
43 void 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 }
55 
56 void 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 }
86