1d65e55d691655462880ffd51c10784955ab6a362Anna Zaks// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix.SimpleStream -verify %s 2d65e55d691655462880ffd51c10784955ab6a362Anna Zaks 335d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks#include "Inputs/system-header-simulator-for-simple-stream.h" 4d65e55d691655462880ffd51c10784955ab6a362Anna Zaks 5d65e55d691655462880ffd51c10784955ab6a362Anna Zaksvoid checkDoubleFClose(int *Data) { 6d65e55d691655462880ffd51c10784955ab6a362Anna Zaks FILE *F = fopen("myfile.txt", "w"); 7d65e55d691655462880ffd51c10784955ab6a362Anna Zaks if (F != 0) { 8d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fputs ("fopen example", F); 9d65e55d691655462880ffd51c10784955ab6a362Anna Zaks if (!Data) 10d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fclose(F); 11d65e55d691655462880ffd51c10784955ab6a362Anna Zaks else 12d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fputc(*Data, F); 13d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fclose(F); // expected-warning {{Closing a previously closed file stream}} 14d65e55d691655462880ffd51c10784955ab6a362Anna Zaks } 15d65e55d691655462880ffd51c10784955ab6a362Anna Zaks} 16d65e55d691655462880ffd51c10784955ab6a362Anna Zaks 17d65e55d691655462880ffd51c10784955ab6a362Anna Zaksint checkLeak(int *Data) { 18d65e55d691655462880ffd51c10784955ab6a362Anna Zaks FILE *F = fopen("myfile.txt", "w"); 19d65e55d691655462880ffd51c10784955ab6a362Anna Zaks if (F != 0) { 20d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fputs ("fopen example", F); 21d65e55d691655462880ffd51c10784955ab6a362Anna Zaks } 22d65e55d691655462880ffd51c10784955ab6a362Anna Zaks 23d65e55d691655462880ffd51c10784955ab6a362Anna Zaks if (Data) // expected-warning {{Opened file is never closed; potential resource leak}} 24d65e55d691655462880ffd51c10784955ab6a362Anna Zaks return *Data; 25d65e55d691655462880ffd51c10784955ab6a362Anna Zaks else 26d65e55d691655462880ffd51c10784955ab6a362Anna Zaks return 0; 27d65e55d691655462880ffd51c10784955ab6a362Anna Zaks} 28d65e55d691655462880ffd51c10784955ab6a362Anna Zaks 29d65e55d691655462880ffd51c10784955ab6a362Anna Zaksvoid checkLeakFollowedByAssert(int *Data) { 30d65e55d691655462880ffd51c10784955ab6a362Anna Zaks FILE *F = fopen("myfile.txt", "w"); 31d65e55d691655462880ffd51c10784955ab6a362Anna Zaks if (F != 0) { 32d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fputs ("fopen example", F); 33d65e55d691655462880ffd51c10784955ab6a362Anna Zaks if (!Data) 34d65e55d691655462880ffd51c10784955ab6a362Anna Zaks exit(0); 35d65e55d691655462880ffd51c10784955ab6a362Anna Zaks fclose(F); 36d65e55d691655462880ffd51c10784955ab6a362Anna Zaks } 37d65e55d691655462880ffd51c10784955ab6a362Anna Zaks} 3832133cfb333510ba94aff040067713c0b32d58c5Anna Zaks 3932133cfb333510ba94aff040067713c0b32d58c5Anna Zaksvoid CloseOnlyOnValidFileHandle() { 4032133cfb333510ba94aff040067713c0b32d58c5Anna Zaks FILE *F = fopen("myfile.txt", "w"); 4132133cfb333510ba94aff040067713c0b32d58c5Anna Zaks if (F) 4232133cfb333510ba94aff040067713c0b32d58c5Anna Zaks fclose(F); 4332133cfb333510ba94aff040067713c0b32d58c5Anna Zaks int x = 0; // no warning 4432133cfb333510ba94aff040067713c0b32d58c5Anna Zaks} 458501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks 468501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaksvoid leakOnEnfOfPath1(int *Data) { 4763bc186d6ac0b44ba4ec6fccb5f471b05c79b666Jordan Rose FILE *F = fopen("myfile.txt", "w"); 4863bc186d6ac0b44ba4ec6fccb5f471b05c79b666Jordan Rose} // expected-warning {{Opened file is never closed; potential resource leak}} 498501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks 508501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaksvoid leakOnEnfOfPath2(int *Data) { 518501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks FILE *F = fopen("myfile.txt", "w"); 528501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks return; // expected-warning {{Opened file is never closed; potential resource leak}} 538501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks} 548501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks 558501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna ZaksFILE *leakOnEnfOfPath3(int *Data) { 568501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks FILE *F = fopen("myfile.txt", "w"); 578501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks return F; 588501b7a1c4c4a9ba0ea6cb8e500e601ef3759debAnna Zaks} 5935d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks 6035d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaksvoid myfclose(FILE *F); 6135d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaksvoid SymbolEscapedThroughFunctionCall() { 6235d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks FILE *F = fopen("myfile.txt", "w"); 6335d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks myfclose(F); 6435d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks return; // no warning 6535d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks} 6635d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks 6735d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna ZaksFILE *GlobalF; 6835d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaksvoid SymbolEscapedThroughAssignmentToGloabl() { 6935d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks FILE *F = fopen("myfile.txt", "w"); 7035d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks GlobalF = F; 7135d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks return; // no warning 7235d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks} 7335d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks 7435d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaksvoid SymbolDoesNotEscapeThoughStringAPIs(char *Data) { 7535d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks FILE *F = fopen("myfile.txt", "w"); 7635d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks fputc(*Data, F); 7735d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks return; // expected-warning {{Opened file is never closed; potential resource leak}} 7835d4a09efbdc313b02f05612e6501a7ec7d3a37dAnna Zaks} 79233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks 80233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaksvoid passConstPointer(const FILE * F); 81233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaksvoid testPassConstPointer() { 82233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks FILE *F = fopen("myfile.txt", "w"); 83233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks passConstPointer(F); 84233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks return; // expected-warning {{Opened file is never closed; potential resource leak}} 85233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks} 86233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks 87233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaksvoid testPassToSystemHeaderFunctionIndirectly() { 88233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks FileStruct fs; 89233e26acc0ff2a1098f4c813f69286fce840a422Anna Zaks fs.p = fopen("myfile.txt", "w"); 90374ae320b87c15b0262c40e5c46e8990111df5caJordan Rose fakeSystemHeaderCall(&fs); // invalidates fs, making fs.p unreachable 91374ae320b87c15b0262c40e5c46e8990111df5caJordan Rose} // no-warning 92