stream.c revision 766c20130dc6b960be420483a168c82a66b5bb7b
1c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -analyzer-store region -verify %s 2c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu 3c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xutypedef __typeof__(sizeof(int)) size_t; 4c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xutypedef struct _IO_FILE FILE; 523d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu#define SEEK_SET 0 /* Seek from beginning of file. */ 623d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu#define SEEK_CUR 1 /* Seek from current position. */ 723d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu#define SEEK_END 2 /* Seek from end of file. */ 823d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuextern FILE *fopen(const char *path, const char *mode); 947dc37f1efa6942366dd61c4acb0c874049dd1e0Zhongxing Xuextern FILE *tmpfile(void); 109843ba9be3560f7b283a6b5a927e4620cfce897dZhongxing Xuextern int fclose(FILE *fp); 1123d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuextern size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 1223d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuextern int fseek (FILE *__stream, long int __off, int __whence); 1323d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuextern long int ftell (FILE *__stream); 1423d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuextern void rewind (FILE *__stream); 15c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu 16c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xuvoid f1(void) { 17c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu FILE *p = fopen("foo", "r"); 18c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu char buf[1024]; 19c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu fread(buf, 1, 1, p); // expected-warning {{Stream pointer might be NULL.}} 20766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 21c196095fa0b83d10b2c20fccfcb8198ee66451aaZhongxing Xu} 2223d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu 2323d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuvoid f2(void) { 2423d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu FILE *p = fopen("foo", "r"); 2523d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu fseek(p, 1, SEEK_SET); // expected-warning {{Stream pointer might be NULL.}} 26766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 2723d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu} 2823d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu 2923d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuvoid f3(void) { 3023d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu FILE *p = fopen("foo", "r"); 3123d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu ftell(p); // expected-warning {{Stream pointer might be NULL.}} 32766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 3323d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu} 3423d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu 3523d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xuvoid f4(void) { 3623d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu FILE *p = fopen("foo", "r"); 3723d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu rewind(p); // expected-warning {{Stream pointer might be NULL.}} 38766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 3923d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu} 4023d90f90413ff1efd7e4410d28ae2cab99af1fdbZhongxing Xu 410c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xuvoid f5(void) { 420c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xu FILE *p = fopen("foo", "r"); 430c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xu if (!p) 440c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xu return; 450c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xu fseek(p, 1, SEEK_SET); // no-warning 460c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xu fseek(p, 1, 3); // expected-warning {{The whence argument to fseek() should be SEEK_SET, SEEK_END, or SEEK_CUR.}} 47766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 480c2e8c87f18e861cb48965784e20b9292fb70b60Zhongxing Xu} 499843ba9be3560f7b283a6b5a927e4620cfce897dZhongxing Xu 509843ba9be3560f7b283a6b5a927e4620cfce897dZhongxing Xuvoid f6(void) { 519843ba9be3560f7b283a6b5a927e4620cfce897dZhongxing Xu FILE *p = fopen("foo", "r"); 529843ba9be3560f7b283a6b5a927e4620cfce897dZhongxing Xu fclose(p); 53c6a36ff1d5769feb95841d934ae85159e23b9defZhongxing Xu fclose(p); // expected-warning {{Try to close a file Descriptor already closed. Cause undefined behaviour.}} 549843ba9be3560f7b283a6b5a927e4620cfce897dZhongxing Xu} 5547dc37f1efa6942366dd61c4acb0c874049dd1e0Zhongxing Xu 5647dc37f1efa6942366dd61c4acb0c874049dd1e0Zhongxing Xuvoid f7(void) { 5747dc37f1efa6942366dd61c4acb0c874049dd1e0Zhongxing Xu FILE *p = tmpfile(); 5847dc37f1efa6942366dd61c4acb0c874049dd1e0Zhongxing Xu ftell(p); // expected-warning {{Stream pointer might be NULL.}} 59766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 60766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu} 61766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu 62766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xuvoid f8(int c) { 63766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu FILE *p = fopen("foo.c", "r"); 64766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu if(c) 65766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu return; // expected-warning {{Opened File never closed. Potential Resource leak.}} 66766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu fclose(p); 67766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu} 68766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu 69766c20130dc6b960be420483a168c82a66b5bb7bZhongxing XuFILE *f9(void) { 70766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu FILE *p = fopen("foo.c", "r"); 71766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu if (p) 72766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu return p; // no-warning 73766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu else 74766c20130dc6b960be420483a168c82a66b5bb7bZhongxing Xu return 0; 7547dc37f1efa6942366dd61c4acb0c874049dd1e0Zhongxing Xu} 76