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