diff options
Diffstat (limited to 'test/Analysis/simple-stream-checks.c')
-rw-r--r-- | test/Analysis/simple-stream-checks.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/test/Analysis/simple-stream-checks.c b/test/Analysis/simple-stream-checks.c new file mode 100644 index 0000000000..574f6ad3d5 --- /dev/null +++ b/test/Analysis/simple-stream-checks.c @@ -0,0 +1,44 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix.SimpleStream -verify %s + +typedef struct __sFILE { + unsigned char *_p; +} FILE; +FILE *fopen(const char * restrict, const char * restrict) __asm("_" "fopen" ); +int fputc(int, FILE *); +int fputs(const char * restrict, FILE * restrict) __asm("_" "fputs" ); +int fclose(FILE *); +void exit(int); + +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); + } +} |