1 // RUN: %clang_cc1 -std=c99 -Dbool=_Bool -analyze -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify %s 2 // RUN: %clang_cc1 -x c++ -analyze -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify %s 3 4 int var; 5 6 void 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 11 void 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 16 void 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 21 void 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 26 void 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 31 void 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}} 35 void 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 40 void 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 46 void 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 52 void 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 59 void 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-warning 64 } 65 66 void ok_other(int x, int y) { 67 var = 77 / y; 68 if (x == 0) { 69 } 70 } 71 72 void ok_assign(int x) { 73 var = 77 / x; 74 x = var / 77; // <- assignment => don't warn 75 if (x == 0) { 76 } 77 } 78 79 void ok_assign2(int x) { 80 var = 77 / x; 81 x = var / 77; // <- assignment => don't warn 82 if (0 == x) { 83 } 84 } 85 86 void ok_dec(int x) { 87 var = 77 / x; 88 x--; // <- assignment => don't warn 89 if (x == 0) { 90 } 91 } 92 93 void ok_inc(int x) { 94 var = 77 / x; 95 x++; // <- assignment => don't warn 96 if (x == 0) { 97 } 98 } 99 100 void do_something_ptr(int *x); 101 void ok_callfunc_ptr(int x) { 102 var = 77 / x; 103 do_something_ptr(&x); // <- pass address of x to function => don't warn 104 if (x == 0) { 105 } 106 } 107 108 void do_something(int x); 109 void 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 115 void ok_if(int x) { 116 if (x > 3) 117 var = 77 / x; 118 if (x == 0) { 119 } 120 } 121 122 void ok_if2(int x) { 123 if (x < 3) 124 var = 77 / x; 125 if (x == 0) { 126 } // TODO warn here 127 } 128 129 void ok_pif(int x) { 130 int *y = &x; 131 if (x < 3) 132 var = 77 / *y; 133 if (x == 0) { 134 } // TODO warn here 135 } 136 137 int getValue(bool *isPositive); 138 void use(int a); 139 void foo() { 140 bool isPositive; 141 int x = getValue(&isPositive); 142 if (isPositive) { 143 use(5 / x); 144 } 145 146 if (x == 0) { 147 } 148 } 149 150 int getValue2(); 151 void foo2() { 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 159 void ok_while(int x) { 160 int n = 100 / x; 161 while (x != 0) { // <- do not warn 162 x--; 163 } 164 } 165 166 void 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 here 175 } 176 177 inline 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 182 void err_inline(int x) { 183 var = 77 / x; 184 inline_func(x); // expected-note {{Calling 'inline_func'}} 185 if (x == 0) { 186 } 187 } 188 189 inline void inline_func2(int x) {} 190 191 void 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 197 inline void inline_func3(int x) { 198 var = 77 / x; 199 } 200 void 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