// RUN: %clang_analyze_cc1 -std=c99 -Dbool=_Bool -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s
// RUN: %clang_analyze_cc1 -x c++ -analyzer-checker=core,alpha.core.TestAfterDivZero -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s
int var;
void err_eq(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (x == 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_eq2(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (0 == x) { } // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_ne(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (x != 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_ge(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (x >= 0) { } // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_le(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (x <= 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_yes(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (x) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_not(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_pnot(int x) {
int *y = &x;
var = 77 / *y; // expected-note {{Division with compared value made here}}
if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_pnot2(int x) {
int *y = &x;
var = 77 / x; // expected-note {{Division with compared value made here}}
if (!*y) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_ppnot(int x) {
int *y = &x;
int **z = &y;
var = 77 / **z; // expected-note {{Division with compared value made here}}
if (!x) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_orig_checker(int x) {
if (x != 0) // expected-note {{Assuming 'x' is equal to 0}} expected-note {{Taking false branch}}
return;
var = 77 / x; // expected-warning {{Division by zero}} expected-note {{Division by zero}}
if (!x) {} // no-warning
}
void ok_other(int x, int y) {
var = 77 / y;
if (x == 0) {
}
}
void ok_assign(int x) {
var = 77 / x;
x = var / 77; // <- assignment => don't warn
if (x == 0) {
}
}
void ok_assign2(int x) {
var = 77 / x;
x = var / 77; // <- assignment => don't warn
if (0 == x) {
}
}
void ok_dec(int x) {
var = 77 / x;
x--; // <- assignment => don't warn
if (x == 0) {
}
}
void ok_inc(int x) {
var = 77 / x;
x++; // <- assignment => don't warn
if (x == 0) {
}
}
void do_something_ptr(int *x);
void ok_callfunc_ptr(int x) {
var = 77 / x;
do_something_ptr(&x); // <- pass address of x to function => don't warn
if (x == 0) {
}
}
void do_something(int x);
void nok_callfunc(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
do_something(x);
if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void ok_if(int x) {
if (x > 3)
var = 77 / x;
if (x == 0) {
}
}
void ok_if2(int x) {
if (x < 3)
var = 77 / x;
if (x == 0) {
} // TODO warn here
}
void ok_pif(int x) {
int *y = &x;
if (x < 3)
var = 77 / *y;
if (x == 0) {
} // TODO warn here
}
int getValue(bool *isPositive);
void use(int a);
void foo(void) {
bool isPositive;
int x = getValue(&isPositive);
if (isPositive) {
use(5 / x);
}
if (x == 0) {
}
}
int getValue2(void);
void foo2(void) {
int x = getValue2();
int y = x;
use(5 / x); // expected-note {{Division with compared value made here}}
if (y == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void ok_while(int x) {
int n = 100 / x;
while (x != 0) { // <- do not warn
x--;
}
}
void err_not2(int x, int y) {
int v;
var = 77 / x;
if (y)
v = 0;
if (!x) {
} // TODO warn here
}
inline void inline_func(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
void err_inline(int x) {
var = 77 / x;
inline_func(x); // expected-note {{Calling 'inline_func'}}
if (x == 0) {
}
}
inline void inline_func2(int x) {}
void err_inline2(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
inline_func2(x);
if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}
inline void inline_func3(int x) {
var = 77 / x;
}
void ok_inline(int x) {
var = 77 / x; // expected-note {{Division with compared value made here}}
inline_func3(x);
if (x == 0) {} // expected-warning {{Value being compared against zero has already been used for division}}
} // expected-note@-1 {{Value being compared against zero has already been used for division}}