brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 87761b3 Raw
316 lines · c
1// RUN: %clang_analyze_cc1 -verify %s \2// RUN:   -analyzer-checker=core \3// RUN:   -analyzer-checker=unix.Errno \4// RUN:   -analyzer-checker=unix.Stream \5// RUN:   -analyzer-checker=unix.StdCLibraryFunctions \6// RUN:   -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true \7// RUN:   -analyzer-checker=debug.ExprInspection8 9// enable only StdCLibraryFunctions checker10// RUN: %clang_analyze_cc1 -verify %s \11// RUN:   -analyzer-checker=core \12// RUN:   -analyzer-checker=unix.Errno \13// RUN:   -analyzer-checker=unix.StdCLibraryFunctions \14// RUN:   -analyzer-config unix.StdCLibraryFunctions:ModelPOSIX=true \15// RUN:   -analyzer-checker=debug.ExprInspection16 17#include "Inputs/system-header-simulator.h"18#include "Inputs/errno_var.h"19 20void clang_analyzer_eval(int);21 22const char *WBuf = "123456789";23char RBuf[10];24 25void test_freopen(FILE *F) {26  F = freopen("xxx", "w", F);27  if (F) {28    if (errno) {} // expected-warning{{undefined}}29  } else {30    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}31  }32}33 34void test_fread(FILE *F) {35  size_t Ret = fread(RBuf, 1, 10, F);36  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}37  if (Ret == 10) {38    if (errno) {} // expected-warning{{undefined}}39  } else {40    clang_analyzer_eval(Ret < 10); // expected-warning {{TRUE}}41    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}42  }43  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}44  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}45}46 47void test_fwrite(FILE *F) {48  size_t Ret = fwrite(WBuf, 1, 10, F);49  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}50  if (Ret == 10) {51    if (errno) {} // expected-warning{{undefined}}52  } else {53    clang_analyzer_eval(Ret < 10); // expected-warning {{TRUE}}54    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}55  }56  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}57  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}58}59 60void test_fgetc(FILE *F) {61  int Ret = fgetc(F);62  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}63  if (Ret != EOF) {64    if (errno) {} // expected-warning {{undefined}}65  } else {66    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}67                                     // expected-warning@-1 {{FALSE}}68  }69  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}70  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}71}72 73void test_fputc(FILE *F) {74  int Ret = fputc('a', F);75  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}76  if (Ret != EOF) {77    clang_analyzer_eval(Ret == 'a'); // expected-warning {{TRUE}}78    if (errno) {} // expected-warning {{undefined}}79  } else {80    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}81  }82  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}83  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}84}85 86void test_fgets(char *Buf, int N, FILE *F) {87  char *Ret = fgets(Buf, N, F);88  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}89  clang_analyzer_eval(Buf != NULL); // expected-warning {{TRUE}}90  clang_analyzer_eval(N >= 0); // expected-warning {{TRUE}}91  if (Ret == Buf) {92    if (errno) {} // expected-warning {{undefined}}93  } else {94    clang_analyzer_eval(Ret == 0); // expected-warning {{TRUE}}95    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}96                                     // expected-warning@-1 {{FALSE}}97  }98  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}99  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}100 101  char Buf1[10];102  Ret = fgets(Buf1, 11, F); // expected-warning {{The 1st argument to 'fgets' is a buffer with size 10}}103}104 105void test_fgets_bufsize(FILE *F) {106  char Buf[10];107  fgets(Buf, 11, F); // expected-warning {{The 1st argument to 'fgets' is a buffer with size 10}}108}109 110void test_fputs(char *Buf, FILE *F) {111  int Ret = fputs(Buf, F);112  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}113  clang_analyzer_eval(Buf != NULL); // expected-warning {{TRUE}}114  if (Ret >= 0) {115    if (errno) {} // expected-warning {{undefined}}116  } else {117    clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}118    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}119  }120  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}121  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}122}123 124void test_ungetc(FILE *F) {125  int Ret = ungetc('X', F);126  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}127  if (Ret == 'X') {128    if (errno) {} // expected-warning {{undefined}}129  } else {130    clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}131    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}132  }133  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}134  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}135}136 137void test_ungetc_EOF(FILE *F, int C) {138  int Ret = ungetc(EOF, F);139  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}140  clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}141  clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}142  Ret = ungetc(C, F);143  if (Ret == EOF) {144    clang_analyzer_eval(C == EOF); // expected-warning {{TRUE}}145                                   // expected-warning@-1{{FALSE}}146  }147}148 149void test_fclose(FILE *F) {150  int Ret = fclose(F);151  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}152  if (Ret == 0) {153    if (errno) {} // expected-warning{{undefined}}154  } else {155    clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}156    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}157  }158  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}159  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}160}161 162void test_fseek(FILE *F) {163  int Ret = fseek(F, SEEK_SET, 1);164  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}165  if (Ret == 0) {166    if (errno) {} // expected-warning{{undefined}}167  } else {168    clang_analyzer_eval(Ret == -1); // expected-warning {{TRUE}}169    clang_analyzer_eval(errno != 0); // expected-warning {{TRUE}}170  }171  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}172  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}173}174 175void check_fgetpos(FILE *F) {176  errno = 0;177  fpos_t Pos;178  int Ret = fgetpos(F, &Pos);179  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}180  if (Ret)181    clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}182  else183    clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}184                                     // expected-warning@-1{{FALSE}}185  if (errno) {} // no-warning186  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}187  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}188}189 190void check_fsetpos(FILE *F) {191  errno = 0;192  fpos_t Pos;193  int Ret = fsetpos(F, &Pos);194  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}195  if (Ret)196    clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}197  else198    clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}199                                     // expected-warning@-1{{FALSE}}200  if (errno) {} // no-warning201  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}202  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}203}204 205void check_ftell(FILE *F) {206  errno = 0;207  long Ret = ftell(F);208  clang_analyzer_eval(F != NULL); // expected-warning {{TRUE}}209  if (Ret == -1) {210    clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}211  } else {212    clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}213                                     // expected-warning@-1{{FALSE}}214    clang_analyzer_eval(Ret >= 0); // expected-warning{{TRUE}}215  }216  if (errno) {} // no-warning217  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}218  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}219}220 221void test_rewind(FILE *F) {222  errno = 0;223  rewind(F);224  clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}225  clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}226                                   // expected-warning@-1{{FALSE}}227  rewind(F);228}229 230void test_fflush(FILE *F) {231  errno = 0;232  int Ret = fflush(F);233  clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}234                                  // expected-warning@-1{{FALSE}}235  if (Ret == EOF) {236    clang_analyzer_eval(errno != 0); // expected-warning{{TRUE}}237  } else {238    clang_analyzer_eval(Ret == 0); // expected-warning{{TRUE}}239    clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}240                                     // expected-warning@-1{{FALSE}}241  }242}243 244void test_feof(FILE *F) {245  errno = 0;246  feof(F);247  clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}248  if (errno) {} // no-warning249  clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}250                                   // expected-warning@-1{{FALSE}}251}252 253void test_ferror(FILE *F) {254  errno = 0;255  ferror(F);256  clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}257  if (errno) {} // no-warning258  clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}259                                   // expected-warning@-1{{FALSE}}260}261 262void test_clearerr(FILE *F) {263  errno = 0;264  clearerr(F);265  clang_analyzer_eval(F != NULL); // expected-warning{{TRUE}}266  if (errno) {} // no-warning267  clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}268                                   // expected-warning@-1{{FALSE}}269}270 271void test_fileno(FILE *F) {272  errno = 0;273  int A = fileno(F);274  clang_analyzer_eval(F != NULL);  // expected-warning{{TRUE}}275  clang_analyzer_eval(A >= 0);     // expected-warning{{TRUE}}276  if (errno) {}                    // no-warning277  clang_analyzer_eval(errno == 0); // expected-warning{{TRUE}}278                                   // expected-warning@-1{{FALSE}}279}280 281void freadwrite_zerosize(FILE *F) {282  fwrite(WBuf, 1, 0, F);283  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}284  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}285  fwrite(WBuf, 0, 1, F);286  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}287  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}288  fread(RBuf, 1, 0, F);289  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}290  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}291  fread(RBuf, 0, 1, F);292  clang_analyzer_eval(feof(F)); // expected-warning {{UNKNOWN}}293  clang_analyzer_eval(ferror(F)); // expected-warning {{UNKNOWN}}294}295 296void freadwrite_zerosize_errno(FILE *F, int A) {297  switch (A) {298  case 1:299    fwrite(WBuf, 1, 0, F);300    if (errno) {} // expected-warning{{undefined}}301    break;302  case 2:303    fwrite(WBuf, 0, 1, F);304    if (errno) {} // expected-warning{{undefined}}305    break;306  case 3:307    fread(RBuf, 1, 0, F);308    if (errno) {} // expected-warning{{undefined}}309    break;310  case 4:311    fread(RBuf, 0, 1, F);312    if (errno) {} // expected-warning{{undefined}}313    break;314  }315}316