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