brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · ea1fd78 Raw
205 lines · c
1// RUN: %clang_analyze_cc1 -std=c99 -Dbool=_Bool -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s2// RUN: %clang_analyze_cc1 -x c++ -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s3 4int var;5 6void err_eq(int x) {7  var = 77 / x; // expected-note {{Division with compared value made here}}8  if (x == 0) { } // expected-warning {{Value being compared against zero has already been used for division}}9} // expected-note@-1 {{Value being compared against zero has already been used for division}}10 11void err_eq2(int x) {12  var = 77 / x; // expected-note {{Division with compared value made here}}13  if (0 == x) { } // expected-warning {{Value being compared against zero has already been used for division}}14} // expected-note@-1 {{Value being compared against zero has already been used for division}}15 16void err_ne(int x) {17  var = 77 / x; // expected-note {{Division with compared value made here}}18  if (x != 0) { } // expected-warning {{Value being compared against zero has already been used for division}}19} // expected-note@-1 {{Value being compared against zero has already been used for division}}20 21void err_ge(int x) {22  var = 77 / x; // expected-note {{Division with compared value made here}}23  if (x >= 0) { } // expected-warning {{Value being compared against zero has already been used for division}}24} // expected-note@-1 {{Value being compared against zero has already been used for division}}25 26void err_le(int x) {27  var = 77 / x; // expected-note {{Division with compared value made here}}28  if (x <= 0) {} // expected-warning {{Value being compared against zero has already been used for division}}29} // expected-note@-1 {{Value being compared against zero has already been used for division}}30 31void err_yes(int x) {32  var = 77 / x; // expected-note {{Division with compared value made here}}33  if (x) {} // expected-warning {{Value being compared against zero has already been used for division}}34} // expected-note@-1 {{Value being compared against zero has already been used for division}}35void err_not(int x) {36  var = 77 / x; // expected-note {{Division with compared value made here}}37  if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}38} // expected-note@-1 {{Value being compared against zero has already been used for division}}39 40void err_pnot(int x) {41  int *y = &x;42  var = 77 / *y; // expected-note {{Division with compared value made here}}43  if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}44} // expected-note@-1 {{Value being compared against zero has already been used for division}}45 46void err_pnot2(int x) {47  int *y = &x;48  var = 77 / x; // expected-note {{Division with compared value made here}}49  if (!*y) {} // expected-warning {{Value being compared against zero has already been used for division}}50} // expected-note@-1 {{Value being compared against zero has already been used for division}}51 52void err_ppnot(int x) {53  int *y = &x;54  int **z = &y;55  var = 77 / **z; // expected-note {{Division with compared value made here}}56  if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}57} // expected-note@-1 {{Value being compared against zero has already been used for division}}58 59void err_orig_checker(int x) {60  if (x != 0) // expected-note {{Assuming 'x' is equal to 0}} expected-note {{Taking false branch}}61    return;62  var = 77 / x; // expected-warning {{Division by zero}} expected-note {{Division by zero}}63  if (!x) {} // no-warning64}65 66void ok_other(int x, int y) {67  var = 77 / y;68  if (x == 0) {69  }70}71 72void ok_assign(int x) {73  var = 77 / x;74  x = var / 77; // <- assignment => don't warn75  if (x == 0) {76  }77}78 79void ok_assign2(int x) {80  var = 77 / x;81  x = var / 77; // <- assignment => don't warn82  if (0 == x) {83  }84}85 86void ok_dec(int x) {87  var = 77 / x;88  x--; // <- assignment => don't warn89  if (x == 0) {90  }91}92 93void ok_inc(int x) {94  var = 77 / x;95  x++; // <- assignment => don't warn96  if (x == 0) {97  }98}99 100void do_something_ptr(int *x);101void ok_callfunc_ptr(int x) {102  var = 77 / x;103  do_something_ptr(&x); // <- pass address of x to function => don't warn104  if (x == 0) {105  }106}107 108void do_something(int x);109void nok_callfunc(int x) {110  var = 77 / x; // expected-note {{Division with compared value made here}}111  do_something(x);112  if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}113} // expected-note@-1 {{Value being compared against zero has already been used for division}}114 115void ok_if(int x) {116  if (x > 3)117    var = 77 / x;118  if (x == 0) {119  }120}121 122void ok_if2(int x) {123  if (x < 3)124    var = 77 / x;125  if (x == 0) {126  } // TODO warn here127}128 129void ok_pif(int x) {130  int *y = &x;131  if (x < 3)132    var = 77 / *y;133  if (x == 0) {134  } // TODO warn here135}136 137int getValue(bool *isPositive);138void use(int a);139void foo(void) {140  bool isPositive;141  int x = getValue(&isPositive);142  if (isPositive) {143    use(5 / x);144  }145 146  if (x == 0) {147  }148}149 150int getValue2(void);151void foo2(void) {152  int x = getValue2();153  int y = x;154 155  use(5 / x); // expected-note {{Division with compared value made here}}156  if (y == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}157} // expected-note@-1 {{Value being compared against zero has already been used for division}}158 159void ok_while(int x) {160  int n = 100 / x;161  while (x != 0) { // <- do not warn162    x--;163  }164}165 166void err_not2(int x, int y) {167  int v;168  var = 77 / x;169 170  if (y)171    v = 0;172 173  if (!x) {174  } // TODO warn here175}176 177inline void inline_func(int x) {178  var = 77 / x; // expected-note {{Division with compared value made here}}179  if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}180} // expected-note@-1 {{Value being compared against zero has already been used for division}}181 182void err_inline(int x) {183  var = 77 / x;184  inline_func(x); // expected-note {{Calling 'inline_func'}}185  if (x == 0) {186  }187}188 189inline void inline_func2(int x) {}190 191void err_inline2(int x) {192  var = 77 / x; // expected-note {{Division with compared value made here}}193  inline_func2(x);194  if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}195} // expected-note@-1 {{Value being compared against zero has already been used for division}}196 197inline void inline_func3(int x) {198  var = 77 / x;199}200void ok_inline(int x) {201  var = 77 / x; // expected-note {{Division with compared value made here}}202  inline_func3(x);203  if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}204} // expected-note@-1 {{Value being compared against zero has already been used for division}}205