92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix.SimpleStream -verify %s
 | |
| 
 | |
| #include "Inputs/system-header-simulator-for-simple-stream.h"
 | |
| 
 | |
| void checkDoubleFClose(int *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   if (F != 0) {
 | |
|     fputs ("fopen example", F);
 | |
|     if (!Data)
 | |
|       fclose(F);
 | |
|     else
 | |
|       fputc(*Data, F);
 | |
|     fclose(F); // expected-warning {{Closing a previously closed file stream}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| int checkLeak(int *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   if (F != 0) {
 | |
|     fputs ("fopen example", F);
 | |
|   }
 | |
| 
 | |
|   if (Data) // expected-warning {{Opened file is never closed; potential resource leak}}
 | |
|     return *Data;
 | |
|   else
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| void checkLeakFollowedByAssert(int *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   if (F != 0) {
 | |
|     fputs ("fopen example", F);
 | |
|     if (!Data)
 | |
|       exit(0);
 | |
|     fclose(F);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void CloseOnlyOnValidFileHandle() {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   if (F)
 | |
|     fclose(F);
 | |
|   int x = 0; // no warning
 | |
| }
 | |
| 
 | |
| void leakOnEnfOfPath1(int *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
| } // expected-warning {{Opened file is never closed; potential resource leak}}
 | |
| 
 | |
| void leakOnEnfOfPath2(int *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   return; // expected-warning {{Opened file is never closed; potential resource leak}}
 | |
| }
 | |
| 
 | |
| FILE *leakOnEnfOfPath3(int *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   return F;
 | |
| }
 | |
| 
 | |
| void myfclose(FILE *F);
 | |
| void SymbolEscapedThroughFunctionCall() {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   myfclose(F);
 | |
|   return; // no warning
 | |
| }
 | |
| 
 | |
| FILE *GlobalF;
 | |
| void SymbolEscapedThroughAssignmentToGloabl() {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   GlobalF = F;
 | |
|   return; // no warning
 | |
| }
 | |
| 
 | |
| void SymbolDoesNotEscapeThoughStringAPIs(char *Data) {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   fputc(*Data, F);
 | |
|   return; // expected-warning {{Opened file is never closed; potential resource leak}}
 | |
| }
 | |
| 
 | |
| void passConstPointer(const FILE * F);
 | |
| void testPassConstPointer() {
 | |
|   FILE *F = fopen("myfile.txt", "w");
 | |
|   passConstPointer(F);
 | |
|   return; // expected-warning {{Opened file is never closed; potential resource leak}}
 | |
| }
 | |
| 
 | |
| void testPassToSystemHeaderFunctionIndirectly() {
 | |
|   FileStruct fs;
 | |
|   fs.p = fopen("myfile.txt", "w");
 | |
|   fakeSystemHeaderCall(&fs);
 | |
| }  // expected-warning {{Opened file is never closed; potential resource leak}}
 |