brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · 749c53d Raw
190 lines · c
1// RUN: %clang_analyze_cc1 -verify %s \2// RUN: -analyzer-checker=core \3// RUN: -analyzer-checker=unix.Stream \4// RUN: -analyzer-checker=debug.ExprInspection5 6#include "Inputs/system-header-simulator.h"7#include "Inputs/system-header-simulator-for-valist.h"8 9void clang_analyzer_eval(int);10void clang_analyzer_dump(int);11 12void test_fread(void) {13  FILE *F = fopen("file", "r+");14  if (!F)15    return;16 17  char Buf[3] = {10, 10, 10};18  fread(Buf, 1, 3, F);19  // The check applies to success and failure.20  clang_analyzer_dump(Buf[0]); // expected-warning {{conj_$}} Should not preserve the previous value, thus should not be 10.21  clang_analyzer_dump(Buf[2]); // expected-warning {{conj_$}}22  if (feof(F)) {23    char Buf1[3] = {10, 10, 10};24    fread(Buf1, 1, 3, F); // expected-warning {{is in EOF state}}25    clang_analyzer_dump(Buf1[0]); // expected-warning {{10 S32b}}26    clang_analyzer_dump(Buf1[2]); // expected-warning {{10 S32b}}27  }28 29  fclose(F);30}31 32void test_fwrite(void) {33  FILE *F = fopen("file", "r+");34  if (!F)35    return;36 37  char Buf[3] = {10, 10, 10};38  fwrite(Buf, 1, 3, F);39  // The check applies to success and failure.40  clang_analyzer_dump(Buf[0]); // expected-warning {{10 S32b}}41  clang_analyzer_dump(Buf[2]); // expected-warning {{10 S32b}}42 43  fclose(F);44}45 46void test_fgets() {47  FILE *F = tmpfile();48  if (!F)49    return;50 51  char Buf[3] = {10, 10, 10};52  fgets(Buf, 3, F);53  // The check applies to success and failure.54  clang_analyzer_dump(Buf[0]); // expected-warning {{conj_$}} Should not preserve the previous value, thus should not be 10.55  clang_analyzer_dump(Buf[2]); // expected-warning {{conj_$}}56  if (feof(F)) {57    char Buf1[3] = {10, 10, 10};58    fgets(Buf1, 3, F); // expected-warning {{is in EOF state}}59    clang_analyzer_dump(Buf1[0]); // expected-warning {{10 S32b}}60    clang_analyzer_dump(Buf1[2]); // expected-warning {{10 S32b}}61  }62 63  fclose(F);64}65 66void test_fputs() {67  FILE *F = tmpfile();68  if (!F)69    return;70 71  char *Buf = "aaa";72  fputs(Buf, F);73  // The check applies to success and failure.74  clang_analyzer_dump(Buf[0]); // expected-warning {{97 S32b}}75  clang_analyzer_dump(Buf[2]); // expected-warning {{97 S32b}}76  clang_analyzer_dump(Buf[3]); // expected-warning {{0 S32b}}77 78  fclose(F);79}80 81void test_fscanf() {82  FILE *F = tmpfile();83  if (!F)84    return;85 86  int a = 1;87  unsigned b;88  int Ret = fscanf(F, "%d %u", &a, &b);89  if (Ret == 0) {90    clang_analyzer_dump(a); // expected-warning {{conj_$}}91    // FIXME: should be {{1 S32b}}.92    clang_analyzer_dump(b); // expected-warning {{conj_$}}93    // FIXME: should be {{uninitialized value}}.94  } else if (Ret == 1) {95    clang_analyzer_dump(a); // expected-warning {{conj_$}}96    clang_analyzer_dump(b); // expected-warning {{conj_$}}97    // FIXME: should be {{uninitialized value}}.98  } else if (Ret >= 2) {99    clang_analyzer_dump(a); // expected-warning {{conj_$}}100    clang_analyzer_dump(b); // expected-warning {{conj_$}}101    clang_analyzer_eval(Ret == 2); // expected-warning {{FALSE}} expected-warning {{TRUE}}102    // FIXME: should be only TRUE.103  } else {104    clang_analyzer_dump(a); // expected-warning {{1 S32b}}105    clang_analyzer_dump(b); // expected-warning {{uninitialized value}}106  }107 108  fclose(F);109}110 111void test_getdelim(char *P, size_t Sz) {112  FILE *F = tmpfile();113  if (!F)114    return;115 116  char *P1 = P;117  size_t Sz1 = Sz;118  ssize_t Ret = getdelim(&P, &Sz, '\t', F);119  if (Ret < 0) {120    clang_analyzer_eval(P == P1); // expected-warning {{FALSE}} \121                                  // expected-warning {{TRUE}}122    clang_analyzer_eval(Sz == Sz1); // expected-warning {{FALSE}} \123                                    // expected-warning {{TRUE}}124  } else {125    clang_analyzer_eval(P == P1); // expected-warning {{FALSE}} \126                                  // expected-warning {{TRUE}}127    clang_analyzer_eval(Sz == Sz1); // expected-warning {{FALSE}} \128                                    // expected-warning {{TRUE}}129  }130 131  fclose(F);132}133 134void test_fgetpos() {135  FILE *F = tmpfile();136  if (!F)137    return;138 139  fpos_t Pos = 1;140  int Ret = fgetpos(F, &Pos);141  if (Ret == 0) {142    clang_analyzer_dump(Pos); // expected-warning {{conj_$}}143  } else {144    clang_analyzer_dump(Pos); // expected-warning {{1 S32b}}145  }146 147  fclose(F);148}149 150void test_fprintf() {151  FILE *F1 = tmpfile();152  if (!F1)153    return;154 155  unsigned a = 42;156  char *output = "HELLO";157  int r = fprintf(F1, "%s\t%u\n", output, a);158  // fprintf does not invalidate any of its input159  // 69 is ascii for 'E'160  clang_analyzer_dump(a); // expected-warning {{42 S32b}}161  clang_analyzer_dump(output[1]); // expected-warning {{69 S32b}}162  fclose(F1);163}164 165int test_vfscanf_inner(const char *fmt, ...) {166  FILE *F1 = tmpfile();167  if (!F1)168    return EOF;169 170  va_list ap;171  va_start(ap, fmt);172 173  int r = vfscanf(F1, fmt, ap);174 175  fclose(F1);176  va_end(ap);177  return r;178}179 180void test_vfscanf() {181  int i = 42;182  int j = 43;183  int r = test_vfscanf_inner("%d", &i);184  if (r != EOF) {185    // i gets invalidated by the call to test_vfscanf_inner, not by vfscanf.186    clang_analyzer_dump(i); // expected-warning {{conj_$}}187    clang_analyzer_dump(j); // expected-warning {{43 S32b}}188  }189}190