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