blob: 7a2718ebc5a400b7393f492504d9fc24585edf44 [file] [log] [blame]
Anna Zaksd65e55d2012-10-29 22:51:50 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix.SimpleStream -verify %s
2
3typedef struct __sFILE {
4 unsigned char *_p;
5} FILE;
6FILE *fopen(const char * restrict, const char * restrict) __asm("_" "fopen" );
7int fputc(int, FILE *);
8int fputs(const char * restrict, FILE * restrict) __asm("_" "fputs" );
9int fclose(FILE *);
10void exit(int);
11
12void checkDoubleFClose(int *Data) {
13 FILE *F = fopen("myfile.txt", "w");
14 if (F != 0) {
15 fputs ("fopen example", F);
16 if (!Data)
17 fclose(F);
18 else
19 fputc(*Data, F);
20 fclose(F); // expected-warning {{Closing a previously closed file stream}}
21 }
22}
23
24int checkLeak(int *Data) {
25 FILE *F = fopen("myfile.txt", "w");
26 if (F != 0) {
27 fputs ("fopen example", F);
28 }
29
30 if (Data) // expected-warning {{Opened file is never closed; potential resource leak}}
31 return *Data;
32 else
33 return 0;
34}
35
36void checkLeakFollowedByAssert(int *Data) {
37 FILE *F = fopen("myfile.txt", "w");
38 if (F != 0) {
39 fputs ("fopen example", F);
40 if (!Data)
41 exit(0);
42 fclose(F);
43 }
44}
Anna Zaks32133cf2012-10-31 02:32:41 +000045
46void CloseOnlyOnValidFileHandle() {
47 FILE *F = fopen("myfile.txt", "w");
48 if (F)
49 fclose(F);
50 int x = 0; // no warning
51}
Anna Zaks8501b7a2012-11-03 02:54:20 +000052
53void leakOnEnfOfPath1(int *Data) {
54 FILE *F = fopen("myfile.txt", "w");// expected-warning {{Opened file is never closed; potential resource leak}}
55}
56
57void leakOnEnfOfPath2(int *Data) {
58 FILE *F = fopen("myfile.txt", "w");
59 return; // expected-warning {{Opened file is never closed; potential resource leak}}
60}
61
62FILE *leakOnEnfOfPath3(int *Data) {
63 FILE *F = fopen("myfile.txt", "w");
64 return F;
65}