// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Stream,unix.StdCLibraryFunctions,debug.ExprInspection \ // RUN: -analyzer-config unix.Stream:Pedantic=true \ // RUN: -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true -verify=stream,any %s // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Stream,debug.ExprInspection \ // RUN: -analyzer-config unix.Stream:Pedantic=true \ // RUN: -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true -verify=stream,any %s // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.StdCLibraryFunctions,debug.ExprInspection \ // RUN: -analyzer-config unix.Stream:Pedantic=true \ // RUN: -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true -verify=stdfunc,any %s #include "Inputs/system-header-simulator.h" extern void clang_analyzer_eval(int); void *buf; size_t size; size_t n; void test_fopen(void) { FILE *fp = fopen("path", "r"); clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} any-warning{{FALSE}} fclose(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} } void test_fdopen(int fd) { FILE *fp = fdopen(fd, "r"); clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} any-warning{{FALSE}} fclose(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} } void test_tmpfile(void) { FILE *fp = tmpfile(); clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} any-warning{{FALSE}} fclose(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} } void test_fclose(void) { FILE *fp = tmpfile(); fclose(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} } void test_freopen(void) { FILE *fp = tmpfile(); fp = freopen("file", "w", fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} fclose(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} } void test_fread(void) { FILE *fp = tmpfile(); size_t ret = fread(buf, size, n, fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{The 4th argument to 'fread' is NULL but should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} clang_analyzer_eval(ret <= n); // any-warning{{TRUE}} clang_analyzer_eval(ret == n); // any-warning{{TRUE}} any-warning{{FALSE}} fclose(fp); } void test_fwrite(void) { FILE *fp = tmpfile(); size_t ret = fwrite(buf, size, n, fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{The 4th argument to 'fwrite' is NULL but should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} clang_analyzer_eval(ret <= n); // any-warning{{TRUE}} clang_analyzer_eval(ret == n); // any-warning{{TRUE}} any-warning{{FALSE}} fclose(fp); } void test_fseek(void) { FILE *fp = tmpfile(); fseek(fp, 0, 0); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_ftell(void) { FILE *fp = tmpfile(); ftell(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_rewind(void) { FILE *fp = tmpfile(); rewind(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_fgetpos(void) { FILE *fp = tmpfile(); fpos_t pos; fgetpos(fp, &pos); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_fsetpos(void) { FILE *fp = tmpfile(); fpos_t pos; fsetpos(fp, &pos); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_clearerr(void) { FILE *fp = tmpfile(); clearerr(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_feof(void) { FILE *fp = tmpfile(); feof(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_ferror(void) { FILE *fp = tmpfile(); ferror(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); } void test_fileno(void) { FILE *fp = tmpfile(); fileno(fp); // \ // stream-warning{{Stream pointer might be NULL}} \ // stdfunc-warning{{should not be NULL}} clang_analyzer_eval(fp != NULL); // any-warning{{TRUE}} fclose(fp); }