Home | History | Annotate | Download | only in Analysis
      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