blob: 2f09e5dd20e4457180177bab0979a65f3fb20e7a [file] [log] [blame]
Anna Zaksd65e55d2012-10-29 22:51:50 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix.SimpleStream -verify %s
2
Anna Zaks35d4a092012-11-06 04:20:57 +00003#include "Inputs/system-header-simulator-for-simple-stream.h"
Anna Zaksd65e55d2012-10-29 22:51:50 +00004
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 else
12 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 else
26 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}
Anna Zaks32133cf2012-10-31 02:32:41 +000038
39void CloseOnlyOnValidFileHandle() {
40 FILE *F = fopen("myfile.txt", "w");
41 if (F)
42 fclose(F);
43 int x = 0; // no warning
44}
Anna Zaks8501b7a2012-11-03 02:54:20 +000045
46void leakOnEnfOfPath1(int *Data) {
47 FILE *F = fopen("myfile.txt", "w");// expected-warning {{Opened file is never closed; potential resource leak}}
48}
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}
Anna Zaks35d4a092012-11-06 04:20:57 +000059
60void myfclose(FILE *F);
61void SymbolEscapedThroughFunctionCall() {
62 FILE *F = fopen("myfile.txt", "w");
63 myfclose(F);
64 return; // no warning
65}
66
67FILE *GlobalF;
68void SymbolEscapedThroughAssignmentToGloabl() {
69 FILE *F = fopen("myfile.txt", "w");
70 GlobalF = F;
71 return; // no warning
72}
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}