97 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.unix.SimpleStream -verify %s2 3#include "Inputs/system-header-simulator-for-simple-stream.h"4 5void 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 else12 fputc(*Data, F);13 fclose(F); // expected-warning {{Closing a previously closed file stream}}14 }15}16 17int 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 else26 return 0;27}28 29void 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 39void CloseOnlyOnValidFileHandle(void) {40 FILE *F = fopen("myfile.txt", "w");41 if (F)42 fclose(F);43 int x = 0; // no warning44}45 46void leakOnEnfOfPath1(int *Data) {47 FILE *F = fopen("myfile.txt", "w");48} // expected-warning {{Opened file is never closed; potential resource leak}}49 50void leakOnEnfOfPath2(int *Data) {51 FILE *F = fopen("myfile.txt", "w");52 return; // expected-warning {{Opened file is never closed; potential resource leak}}53}54 55FILE *leakOnEnfOfPath3(int *Data) {56 FILE *F = fopen("myfile.txt", "w");57 return F;58}59 60void myfclose(FILE *F);61void SymbolEscapedThroughFunctionCall(void) {62 FILE *F = fopen("myfile.txt", "w");63 myfclose(F);64 return; // no warning65}66 67FILE *GlobalF;68void SymbolEscapedThroughAssignmentToGlobal(void) {69 FILE *F = fopen("myfile.txt", "w");70 GlobalF = F;71 return; // no warning72}73 74void 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 80void passConstPointer(const FILE * F);81void testPassConstPointer(void) {82 FILE *F = fopen("myfile.txt", "w");83 passConstPointer(F);84 return; // expected-warning {{Opened file is never closed; potential resource leak}}85}86 87void testPassToSystemHeaderFunctionIndirectly(void) {88 FileStruct fs;89 fs.p = fopen("myfile.txt", "w");90 fakeSystemHeaderCall(&fs); // invalidates fs, making fs.p unreachable91} // no-warning92 93void testOverwrite(void) {94 FILE *fp = fopen("myfile.txt", "w");95 fp = 0;96} // expected-warning {{Opened file is never closed; potential resource leak}}97