brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.4 KiB · 9de56c0 Raw
632 lines · c
1// RUN: %clang_analyze_cc1 -verify %s \2// RUN: -analyzer-checker=core \3// RUN: -analyzer-checker=unix.Stream \4// RUN: -analyzer-config unix.Stream:Pedantic=true \5// RUN: -analyzer-checker=debug.StreamTester \6// RUN: -analyzer-checker=debug.ExprInspection7 8#include "Inputs/system-header-simulator.h"9 10void clang_analyzer_eval(int);11void clang_analyzer_dump(int);12void clang_analyzer_warnIfReached(void);13void StreamTesterChecker_make_feof_stream(FILE *);14void StreamTesterChecker_make_ferror_stream(FILE *);15void StreamTesterChecker_make_ferror_indeterminate_stream(FILE *);16 17void error_fopen(void) {18  FILE *F = fopen("file", "r");19  if (!F)20    return;21  clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}22  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}23  fclose(F);24}25 26void error_fdopen(int fd) {27  FILE *F = fdopen(fd, "r");28  if (!F)29    return;30  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}31  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}32  fclose(F);33}34 35void error_freopen(void) {36  FILE *F = fopen("file", "r");37  if (!F)38    return;39  F = freopen(0, "w", F);40  if (!F)41    return;42  clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}43  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}44  fclose(F);45}46 47void stream_error_feof(void) {48  FILE *F = fopen("file", "r");49  if (!F)50    return;51  StreamTesterChecker_make_feof_stream(F);52  clang_analyzer_eval(feof(F));   // expected-warning {{TRUE}}53  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}54  clearerr(F);55  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}56  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}57  StreamTesterChecker_make_ferror_indeterminate_stream(F);58  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}59  fclose(F);60}61 62void stream_error_ferror(void) {63  FILE *F = fopen("file", "r");64  if (!F)65    return;66  StreamTesterChecker_make_ferror_stream(F);67  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}68  clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}69  clearerr(F);70  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}71  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}72  StreamTesterChecker_make_ferror_indeterminate_stream(F);73  clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}74  fclose(F);75}76 77void error_fread(void) {78  FILE *F = tmpfile();79  if (!F)80    return;81  char Buf[10];82  int Ret = fread(Buf, 1, 10, F);83  if (Ret == 10) {84    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}85  } else {86    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{TRUE}}87    if (feof(F)) {88      clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}}89      fread(Buf, 1, 10, F);           // expected-warning {{Read function called when stream is in EOF state}}90      clang_analyzer_eval(feof(F));   // expected-warning {{TRUE}}91      clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}92    }93    if (ferror(F)) {94      clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}}95      fread(Buf, 1, 10, F);           // expected-warning {{might be 'indeterminate'}}96    }97  }98  fclose(F);99  Ret = fread(Buf, 1, 10, F); // expected-warning {{Use of a stream that might be already closed}}100}101 102void error_fwrite(void) {103  FILE *F = tmpfile();104  if (!F)105    return;106  const char *Buf = "123456789";107  int Ret = fwrite(Buf, 1, 10, F);108  if (Ret == 10) {109    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}110  } else {111    clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}112    clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}113    fwrite(0, 1, 10, F);            // expected-warning {{might be 'indeterminate'}}114  }115  fclose(F);116  Ret = fwrite(0, 1, 10, F); // expected-warning {{Use of a stream that might be already closed}}117}118 119void error_fgetc(void) {120  FILE *F = tmpfile();121  if (!F)122    return;123  int Ret = fgetc(F);124  if (0 <= Ret && Ret <= 255) {125    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}126  } else {127    clang_analyzer_eval(Ret == EOF);           // expected-warning {{TRUE}}128    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{TRUE}}129    if (feof(F)) {130      clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}131      fgetc(F);                       // expected-warning {{Read function called when stream is in EOF state}}132    } else {133      clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}134      fgetc(F);                       // expected-warning {{might be 'indeterminate'}}135    }136  }137  fclose(F);138  fgetc(F); // expected-warning {{Use of a stream that might be already closed}}139}140 141void error_fgets(void) {142  FILE *F = tmpfile();143  char Buf[256];144  if (!F)145    return;146  char *Ret = fgets(Buf, sizeof(Buf), F);147  if (Ret == Buf) {148    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}149  } else {150    clang_analyzer_eval(Ret == NULL);          // expected-warning {{TRUE}}151    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{TRUE}}152    if (feof(F)) {153      clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}154      fgets(Buf, sizeof(Buf), F);     // expected-warning {{Read function called when stream is in EOF state}}155    } else {156      clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}157      fgets(Buf, sizeof(Buf), F);     // expected-warning {{might be 'indeterminate'}}158    }159  }160  fclose(F);161  fgets(Buf, sizeof(Buf), F);         // expected-warning {{Use of a stream that might be already closed}}162}163 164void error_fputc(int fd) {165  FILE *F = fdopen(fd, "w");166  if (!F)167    return;168  int Ret = fputc('X', F);169  if (Ret == EOF) {170    clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}171    clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}172    fputc('Y', F);                  // expected-warning {{might be 'indeterminate'}}173  } else {174    clang_analyzer_eval(Ret == 'X');             // expected-warning {{TRUE}}175    clang_analyzer_eval(feof(F) || ferror(F));   // expected-warning {{FALSE}}176    fputc('Y', F);                               // no-warning177  }178  fclose(F);179  fputc('A', F); // expected-warning {{Use of a stream that might be already closed}}180}181 182void error_fputs(void) {183  FILE *F = tmpfile();184  if (!F)185    return;186  int Ret = fputs("XYZ", F);187  if (Ret >= 0) {188    clang_analyzer_eval(feof(F) || ferror(F));   // expected-warning {{FALSE}}189    fputs("QWD", F);                             // no-warning190  } else {191    clang_analyzer_eval(Ret == EOF); // expected-warning {{TRUE}}192    clang_analyzer_eval(ferror(F));  // expected-warning {{TRUE}}193    clang_analyzer_eval(feof(F));    // expected-warning {{FALSE}}194    fputs("QWD", F);                 // expected-warning {{might be 'indeterminate'}}195  }196  fclose(F);197  fputs("ABC", F); // expected-warning {{Use of a stream that might be already closed}}198}199 200void error_fprintf(void) {201  FILE *F = tmpfile();202  if (!F)203    return;204  int Ret = fprintf(F, "aaa");205  if (Ret >= 0) {206    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}207    fprintf(F, "bbb");                         // no-warning208  } else {209    clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}210    clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}211    fprintf(F, "bbb");              // expected-warning {{might be 'indeterminate'}}212  }213  fclose(F);214  fprintf(F, "ccc"); // expected-warning {{Use of a stream that might be already closed}}215}216 217void error_fscanf(int *A) {218  FILE *F = tmpfile();219  if (!F)220    return;221  int Ret = fscanf(F, "a%ib", A);222  if (Ret >= 0) {223    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}224    fscanf(F, "bbb");                          // no-warning225  } else {226    if (ferror(F)) {227      clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}}228      fscanf(F, "bbb");               // expected-warning {{might be 'indeterminate'}}229    } else if (feof(F)) {230      clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}}231      fscanf(F, "bbb");               // expected-warning {{is in EOF state}}232      clang_analyzer_eval(feof(F));   // expected-warning {{TRUE}}233    } else {234      clang_analyzer_warnIfReached(); // expected-warning {{REACHABLE}}235      fscanf(F, "bbb");               // expected-warning {{might be 'indeterminate'}}236    }237  }238  fclose(F);239  fscanf(F, "ccc"); // expected-warning {{Use of a stream that might be already closed}}240}241 242void error_ungetc(int TestIndeterminate) {243  FILE *F = tmpfile();244  if (!F)245    return;246  int Ret = ungetc('X', F);247  clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}248  if (Ret == EOF) {249    clang_analyzer_warnIfReached();          // expected-warning {{REACHABLE}}250  } else {251    clang_analyzer_eval(Ret == 'X');         // expected-warning {{TRUE}}252  }253  fputc('Y', F);                             // no-warning254  if (TestIndeterminate) {255    StreamTesterChecker_make_ferror_indeterminate_stream(F);256    ungetc('X', F);                          // expected-warning {{might be 'indeterminate'}}257  }258  fclose(F);259  ungetc('A', F);                            // expected-warning {{Use of a stream that might be already closed}}260}261 262void error_getdelim(char *P, size_t Sz) {263  FILE *F = tmpfile();264  if (!F)265    return;266  ssize_t Ret = getdelim(&P, &Sz, '\t', F);267  if (Ret >= 0) {268    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}269  } else {270    clang_analyzer_eval(Ret == -1);            // expected-warning {{TRUE}}271    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{TRUE}}272    if (feof(F)) {273      clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}274      getdelim(&P, &Sz, '\n', F);     // expected-warning {{Read function called when stream is in EOF state}}275    } else {276      clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}277      getdelim(&P, &Sz, '\n', F);     // expected-warning {{might be 'indeterminate'}}278    }279  }280  fclose(F);281  getdelim(&P, &Sz, '\n', F);         // expected-warning {{Use of a stream that might be already closed}}282}283 284void error_getline(char *P, size_t Sz) {285  FILE *F = tmpfile();286  if (!F)287    return;288  ssize_t Ret = getline(&P, &Sz, F);289  if (Ret >= 0) {290    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}291  } else {292    clang_analyzer_eval(Ret == -1);            // expected-warning {{TRUE}}293    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{TRUE}}294    if (feof(F)) {295      clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}296      getline(&P, &Sz, F);            // expected-warning {{Read function called when stream is in EOF state}}297    } else {298      clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}299      getline(&P, &Sz, F);            // expected-warning {{might be 'indeterminate'}}300    }301  }302  fclose(F);303  getline(&P, &Sz, F);                // expected-warning {{Use of a stream that might be already closed}}304}305 306void write_after_eof_is_allowed(void) {307  FILE *F = tmpfile();308  if (!F)309    return;310  StreamTesterChecker_make_feof_stream(F);311  if (fputs("QWD", F) >= 0)                    // no-warning312    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}313  StreamTesterChecker_make_feof_stream(F);314  if (fputc('Q', F) == 'Q')                    // no-warning315    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}316  StreamTesterChecker_make_feof_stream(F);317  if (fwrite("012345678", 1, 10, F) == 10)     // no-warning318    clang_analyzer_eval(feof(F) || ferror(F)); // expected-warning {{FALSE}}319  fclose(F);320}321 322void freadwrite_zerosize(FILE *F) {323  size_t Ret;324  Ret = fwrite(0, 1, 0, F);325  clang_analyzer_dump(Ret); // expected-warning {{0 }}326  Ret = fwrite(0, 0, 1, F);327  clang_analyzer_dump(Ret); // expected-warning {{0 }}328  Ret = fread(0, 1, 0, F);329  clang_analyzer_dump(Ret); // expected-warning {{0 }}330  Ret = fread(0, 0, 1, F);331  clang_analyzer_dump(Ret); // expected-warning {{0 }}332}333 334void freadwrite_zerosize_eofstate(FILE *F) {335  fwrite(0, 1, 0, F);336  fwrite(0, 0, 1, F);337  fread(0, 1, 0, F); // expected-warning {{Read function called when stream is in EOF state}}338  fread(0, 0, 1, F); // expected-warning {{Read function called when stream is in EOF state}}339}340 341void error_fread_fwrite_zerosize(void) {342  FILE *F = fopen("file", "r");343  if (!F)344    return;345 346  freadwrite_zerosize(F);347  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}348  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}349 350  StreamTesterChecker_make_ferror_stream(F);351  freadwrite_zerosize(F);352  clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}353  clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}354 355  StreamTesterChecker_make_feof_stream(F);356  freadwrite_zerosize_eofstate(F);357  clang_analyzer_eval(feof(F));   // expected-warning {{TRUE}}358  clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}359 360  fclose(F);361}362 363void error_fseek(void) {364  FILE *F = fopen("file", "r");365  if (!F)366    return;367  int rc = fseek(F, 1, SEEK_SET);368  if (rc) {369    clang_analyzer_eval(rc == -1);     // expected-warning {{TRUE}}370    int IsFEof = feof(F), IsFError = ferror(F);371    // Get ferror or no error.372    clang_analyzer_eval(IsFError);     // expected-warning {{FALSE}} \373                                       // expected-warning {{TRUE}}374    clang_analyzer_eval(IsFEof);       // expected-warning {{FALSE}}375    // Error flags should not change.376    clang_analyzer_eval(feof(F));      // expected-warning {{FALSE}}377    if (IsFError)378      clang_analyzer_eval(ferror(F));  // expected-warning {{TRUE}}379  } else {380    clang_analyzer_eval(feof(F));      // expected-warning {{FALSE}}381    clang_analyzer_eval(ferror(F));    // expected-warning {{FALSE}}382    // Error flags should not change.383    clang_analyzer_eval(feof(F));      // expected-warning {{FALSE}}384    clang_analyzer_eval(ferror(F));    // expected-warning {{FALSE}}385  }386  fclose(F);387}388 389void error_fseeko(void) {390  FILE *F = fopen("file", "r");391  if (!F)392    return;393  int rc = fseeko(F, 1, SEEK_SET);394  if (rc) {395    // Get ferror or no error.396    clang_analyzer_eval(ferror(F));  // expected-warning {{FALSE}} \397                                     // expected-warning {{TRUE}}398    clang_analyzer_eval(feof(F));    // expected-warning {{FALSE}}399  } else {400    clang_analyzer_eval(feof(F));    // expected-warning {{FALSE}}401    clang_analyzer_eval(ferror(F));  // expected-warning {{FALSE}}402  }403  fclose(F);404}405 406void error_fseek_0(void) {407  FILE *F = fopen("file", "r");408  if (!F)409    return;410  int rc = fseek(F, 0, SEEK_SET);411  if (rc == -1) {412    int IsFEof = feof(F), IsFError = ferror(F);413    // Get ferror or no error, but not feof.414    clang_analyzer_eval(IsFError);415    // expected-warning@-1 {{FALSE}}416    // expected-warning@-2 {{TRUE}}417    clang_analyzer_eval(IsFEof);418    // expected-warning@-1 {{FALSE}}419    // Error flags should not change.420    clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}421    if (IsFError)422      clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}423    else424      clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}425  } else {426    clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}427    clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}428    // Error flags should not change.429    clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}430    clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}431  }432  fclose(F);433}434 435void error_fseeko_0(void) {436  FILE *F = fopen("file", "r");437  if (!F)438    return;439  int rc = fseeko(F, 0, SEEK_SET);440  if (rc) {441    int IsFEof = feof(F), IsFError = ferror(F);442    // Get ferror or no error, but not feof.443    clang_analyzer_eval(IsFError);444    // expected-warning@-1 {{FALSE}}445    // expected-warning@-2 {{TRUE}}446    clang_analyzer_eval(IsFEof);447    // expected-warning@-1 {{FALSE}}448  } else {449    clang_analyzer_eval(feof(F));   // expected-warning {{FALSE}}450    clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}451  }452  fclose(F);453}454 455void error_ftell(int TestIndeterminate) {456  FILE *F = fopen("file", "r");457  if (!F)458    return;459  long rc = ftell(F);460  if (rc >= 0)461    clang_analyzer_warnIfReached();          // expected-warning {{REACHABLE}}462  else463    clang_analyzer_eval(rc == -1);           // expected-warning {{TRUE}}464  clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}}465  StreamTesterChecker_make_feof_stream(F);466  rc = ftell(F);467  clang_analyzer_eval(feof(F));              // expected-warning {{TRUE}}468  clang_analyzer_eval(ferror(F));            // expected-warning {{FALSE}}469  StreamTesterChecker_make_ferror_stream(F);470  rc = ftell(F);471  clang_analyzer_eval(feof(F));              // expected-warning {{FALSE}}472  clang_analyzer_eval(ferror(F));            // expected-warning {{TRUE}}473  if (TestIndeterminate) {474    StreamTesterChecker_make_ferror_indeterminate_stream(F);475    ftell(F);                                // expected-warning {{might be 'indeterminate'}}476  }477  fclose(F);478}479 480void error_ftello(int TestIndeterminate) {481  FILE *F = fopen("file", "r");482  if (!F)483    return;484  off_t rc = ftello(F);485  if (rc >= 0)486    clang_analyzer_warnIfReached();          // expected-warning {{REACHABLE}}487  else488    clang_analyzer_eval(rc == -1);           // expected-warning {{TRUE}}489  clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}}490  StreamTesterChecker_make_feof_stream(F);491  rc = ftello(F);492  clang_analyzer_eval(feof(F));              // expected-warning {{TRUE}}493  clang_analyzer_eval(ferror(F));            // expected-warning {{FALSE}}494  StreamTesterChecker_make_ferror_stream(F);495  rc = ftello(F);496  clang_analyzer_eval(feof(F));              // expected-warning {{FALSE}}497  clang_analyzer_eval(ferror(F));            // expected-warning {{TRUE}}498  if (TestIndeterminate) {499    StreamTesterChecker_make_ferror_indeterminate_stream(F);500    ftell(F);                                // expected-warning {{might be 'indeterminate'}}501  }502  fclose(F);503}504 505void error_fileno(void) {506  FILE *F = fopen("file", "r");507  if (!F)508    return;509  int N = fileno(F);510  clang_analyzer_eval(N >= 0); // expected-warning {{TRUE}}511  clang_analyzer_eval(feof(F) && ferror(F)); // expected-warning {{FALSE}}512  StreamTesterChecker_make_feof_stream(F);513  N = fileno(F);514  clang_analyzer_eval(feof(F));              // expected-warning {{TRUE}}515  clang_analyzer_eval(ferror(F));            // expected-warning {{FALSE}}516  StreamTesterChecker_make_ferror_stream(F);517  N = fileno(F);518  clang_analyzer_eval(feof(F));              // expected-warning {{FALSE}}519  clang_analyzer_eval(ferror(F));            // expected-warning {{TRUE}}520  StreamTesterChecker_make_ferror_indeterminate_stream(F);521  fileno(F);                                 // no warning522  fclose(F);523}524 525void error_fflush_on_non_null_stream_clear_error_states(void) {526  FILE *F0 = tmpfile(), *F1 = tmpfile();527  // `fflush` clears a non-EOF stream's error state.528  if (F0) {529    StreamTesterChecker_make_ferror_stream(F0);530    if (fflush(F0) == 0) {             // no-warning531      clang_analyzer_eval(ferror(F0)); // expected-warning {{FALSE}}532      clang_analyzer_eval(feof(F0));   // expected-warning {{FALSE}}533    }534    fclose(F0);535  }536  // `fflush` clears an EOF stream's error state.537  if (F1) {538    StreamTesterChecker_make_feof_stream(F1);539    if (fflush(F1) == 0) {             // no-warning540      clang_analyzer_eval(ferror(F1)); // expected-warning {{FALSE}}541      clang_analyzer_eval(feof(F1));   // expected-warning {{TRUE}}542    }543    fclose(F1);544  }545}546 547void error_fflush_on_null_stream_clear_error_states(void) {548  FILE *F0 = tmpfile(), *F1 = tmpfile();549  // `fflush` clears all stream's error states, while retains their EOF states.550  if (F0 && F1) {551    StreamTesterChecker_make_ferror_stream(F0);552    StreamTesterChecker_make_feof_stream(F1);553    if (fflush(NULL) == 0) {           // no-warning554      clang_analyzer_eval(ferror(F0)); // expected-warning {{FALSE}}555      clang_analyzer_eval(feof(F0));   // expected-warning {{FALSE}}556      clang_analyzer_eval(ferror(F1)); // expected-warning {{FALSE}}557      clang_analyzer_eval(feof(F1));   // expected-warning {{TRUE}}558    }559  }560  if (F0)561    fclose(F0);562  if (F1)563    fclose(F1);564}565 566void error_indeterminate(void) {567  FILE *F = fopen("file", "r+");568  if (!F)569    return;570  const char *Buf = "123456789";571  int rc = fseek(F, 0, SEEK_SET);572  if (rc) {573    if (feof(F)) {574      fwrite(Buf, 1, 10, F); // no warning575    } else if (ferror(F)) {576      fwrite(Buf, 1, 10, F); // expected-warning {{might be 'indeterminate'}}577    } else {578      fwrite(Buf, 1, 10, F); // expected-warning {{might be 'indeterminate'}}579    }580  }581  fclose(F);582}583 584void error_indeterminate_clearerr(void) {585  FILE *F = fopen("file", "r+");586  if (!F)587    return;588  const char *Buf = "123456789";589  int rc = fseek(F, 0, SEEK_SET);590  if (rc) {591    if (feof(F)) {592      clearerr(F);593      fwrite(Buf, 1, 10, F); // no warning594    } else if (ferror(F)) {595      clearerr(F);596      fwrite(Buf, 1, 10, F); // expected-warning {{might be 'indeterminate'}}597    } else {598      clearerr(F);599      fwrite(Buf, 1, 10, F); // expected-warning {{might be 'indeterminate'}}600    }601  }602  fclose(F);603}604 605void error_indeterminate_feof1(void) {606  FILE *F = fopen("file", "r+");607  if (!F)608    return;609  char Buf[10];610  if (fread(Buf, 1, 10, F) < 10) {611    if (feof(F)) {612      // error is feof, should be non-indeterminate613      fwrite("1", 1, 1, F); // no warning614    }615  }616  fclose(F);617}618 619void error_indeterminate_feof2(void) {620  FILE *F = fopen("file", "r+");621  if (!F)622    return;623  char Buf[10];624  if (fread(Buf, 1, 10, F) < 10) {625    if (ferror(F) == 0) {626      // error is feof, should be non-indeterminate627      fwrite("1", 1, 1, F); // no warning628    }629  }630  fclose(F);631}632