1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix.SimpleStream -verify %s 2 3 #include "Inputs/system-header-simulator-for-simple-stream.h" 4 5 void checkDoubleFClose(int *Data) { 6 FILE *F = fopen("myfile.txt", "w"); 7 if (F != 0) { 8 fputs ("fopen example", F); 9 if (!Data) 10 fclose(F); 11 else 12 fputc(*Data, F); 13 fclose(F); // expected-warning {{Closing a previously closed file stream}} 14 } 15 } 16 17 int checkLeak(int *Data) { 18 FILE *F = fopen("myfile.txt", "w"); 19 if (F != 0) { 20 fputs ("fopen example", F); 21 } 22 23 if (Data) // expected-warning {{Opened file is never closed; potential resource leak}} 24 return *Data; 25 else 26 return 0; 27 } 28 29 void checkLeakFollowedByAssert(int *Data) { 30 FILE *F = fopen("myfile.txt", "w"); 31 if (F != 0) { 32 fputs ("fopen example", F); 33 if (!Data) 34 exit(0); 35 fclose(F); 36 } 37 } 38 39 void CloseOnlyOnValidFileHandle() { 40 FILE *F = fopen("myfile.txt", "w"); 41 if (F) 42 fclose(F); 43 int x = 0; // no warning 44 } 45 46 void leakOnEnfOfPath1(int *Data) { 47 FILE *F = fopen("myfile.txt", "w"); 48 } // expected-warning {{Opened file is never closed; potential resource leak}} 49 50 void leakOnEnfOfPath2(int *Data) { 51 FILE *F = fopen("myfile.txt", "w"); 52 return; // expected-warning {{Opened file is never closed; potential resource leak}} 53 } 54 55 FILE *leakOnEnfOfPath3(int *Data) { 56 FILE *F = fopen("myfile.txt", "w"); 57 return F; 58 } 59 60 void myfclose(FILE *F); 61 void SymbolEscapedThroughFunctionCall() { 62 FILE *F = fopen("myfile.txt", "w"); 63 myfclose(F); 64 return; // no warning 65 } 66 67 FILE *GlobalF; 68 void SymbolEscapedThroughAssignmentToGloabl() { 69 FILE *F = fopen("myfile.txt", "w"); 70 GlobalF = F; 71 return; // no warning 72 } 73 74 void SymbolDoesNotEscapeThoughStringAPIs(char *Data) { 75 FILE *F = fopen("myfile.txt", "w"); 76 fputc(*Data, F); 77 return; // expected-warning {{Opened file is never closed; potential resource leak}} 78 } 79 80 void passConstPointer(const FILE * F); 81 void testPassConstPointer() { 82 FILE *F = fopen("myfile.txt", "w"); 83 passConstPointer(F); 84 return; // expected-warning {{Opened file is never closed; potential resource leak}} 85 } 86 87 void testPassToSystemHeaderFunctionIndirectly() { 88 FileStruct fs; 89 fs.p = fopen("myfile.txt", "w"); 90 fakeSystemHeaderCall(&fs); // invalidates fs, making fs.p unreachable 91 } // no-warning 92