// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.unix.Stream,alpha.unix.Errno,apiModeling.StdCLibraryFunctions,debug.ExprInspection \ // RUN: -analyzer-config apiModeling.StdCLibraryFunctions:ModelPOSIX=true -verify %s #include "Inputs/system-header-simulator.h" #include "Inputs/errno_func.h" extern void clang_analyzer_eval(int); extern void clang_analyzer_dump(int); extern void clang_analyzer_printState(); void check_fopen(void) { FILE *F = fopen("xxx", "r"); if (!F) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno' [alpha.unix.Errno]}} } void check_tmpfile(void) { FILE *F = tmpfile(); if (!F) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno' [alpha.unix.Errno]}} } void check_freopen(void) { FILE *F = tmpfile(); if (!F) return; F = freopen("xxx", "w", F); if (!F) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fclose(void) { FILE *F = tmpfile(); if (!F) return; int Ret = fclose(F); if (Ret == EOF) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fread_size0(void) { char Buf[10]; FILE *F = tmpfile(); if (!F) return; fread(Buf, 0, 1, F); if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fread_nmemb0(void) { char Buf[10]; FILE *F = tmpfile(); if (!F) return; fread(Buf, 1, 0, F); if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fread(void) { char Buf[10]; FILE *F = tmpfile(); if (!F) return; int R = fread(Buf, 1, 10, F); if (R < 10) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning fclose(F); return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fwrite_size0(void) { char Buf[] = "0123456789"; FILE *F = tmpfile(); if (!F) return; fwrite(Buf, 0, 1, F); if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fwrite_nmemb0(void) { char Buf[] = "0123456789"; FILE *F = tmpfile(); if (!F) return; fwrite(Buf, 1, 0, F); if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fwrite(void) { char Buf[] = "0123456789"; FILE *F = tmpfile(); if (!F) return; int R = fwrite(Buf, 1, 10, F); if (R < 10) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning fclose(F); return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_fseek(void) { FILE *F = tmpfile(); if (!F) return; int S = fseek(F, 11, SEEK_SET); if (S != 0) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning fclose(F); return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} } void check_no_errno_change(void) { FILE *F = tmpfile(); if (!F) return; errno = 1; clearerr(F); if (errno) {} // no-warning feof(F); if (errno) {} // no-warning ferror(F); if (errno) {} // no-warning clang_analyzer_eval(errno == 1); // expected-warning{{TRUE}} fclose(F); } void check_fgetpos(void) { FILE *F = tmpfile(); if (!F) return; errno = 0; fpos_t Pos; int Ret = fgetpos(F, &Pos); if (Ret) clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} else clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}} if (errno) {} // no-warning fclose(F); } void check_fsetpos(void) { FILE *F = tmpfile(); if (!F) return; errno = 0; fpos_t Pos; int Ret = fsetpos(F, &Pos); if (Ret) clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} else clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}} if (errno) {} // no-warning fclose(F); } void check_ftell(void) { FILE *F = tmpfile(); if (!F) return; errno = 0; long Ret = ftell(F); if (Ret == -1) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} } else { clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}} clang_analyzer_eval(Ret >= 0); // expected-warning{{TRUE}} } if (errno) {} // no-warning fclose(F); } void check_rewind(void) { FILE *F = tmpfile(); if (!F) return; errno = 0; rewind(F); clang_analyzer_eval(errno == 0); // expected-warning@-1{{FALSE}} // expected-warning@-2{{TRUE}} fclose(F); } void check_fileno(void) { FILE *F = tmpfile(); if (!F) return; int N = fileno(F); if (N == -1) { clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}} if (errno) {} // no-warning fclose(F); return; } if (errno) {} // expected-warning{{An undefined value may be read from 'errno'}} }