99 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core \2// RUN: -analyzer-output=text \3// RUN: -verify %s4 5namespace test_tracking_of_lhs_multiplier {6 int f(int x, int y) {7 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \8 // expected-note {{'p0' initialized to 0}}9 int div = p0 * y; // expected-note {{'div' initialized to 0}}10 return 1 / div; // expected-note {{Division by zero}} \11 // expected-warning {{Division by zero}}12 }13} // namespace test_tracking_of_lhs_multiplier14 15namespace test_tracking_of_rhs_multiplier {16 int f(int x, int y) {17 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \18 // expected-note {{'p0' initialized to 0}}19 int div = y * p0; // expected-note {{'div' initialized to 0}}20 return 1 / div; // expected-note {{Division by zero}} \21 // expected-warning {{Division by zero}}22 }23} // namespace test_tracking_of_rhs_multiplier24 25namespace test_tracking_of_nested_multiplier {26 int f(int x, int y, int z) {27 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \28 // expected-note {{'p0' initialized to 0}}29 int div = y*z*p0; // expected-note {{'div' initialized to 0}}30 return 1 / div; // expected-note {{Division by zero}} \31 // expected-warning {{Division by zero}}32 }33} // namespace test_tracking_of_nested_multiplier34 35namespace test_tracking_through_multiple_stmts {36 int f(int x, int y) {37 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}}38 bool p1 = p0 ? 0 : 1; // expected-note {{'p0' is false}} \39 // expected-note {{'?' condition is false}}40 bool p2 = 1 - p1; // expected-note {{'p2' initialized to 0}}41 int div = p2 * y; // expected-note {{'div' initialized to 0}}42 return 1 / div; // expected-note {{Division by zero}} \43 // expected-warning {{Division by zero}}44 }45} // namespace test_tracking_through_multiple_stmts46 47namespace test_tracking_both_lhs_and_rhs {48 int f(int x, int y) {49 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \50 // expected-note {{'p0' initialized to 0}}51 bool p1 = y < 0; // expected-note {{Assuming 'y' is >= 0}} \52 // expected-note {{'p1' initialized to 0}}53 int div = p0 * p1; // expected-note {{'div' initialized to 0}}54 return 1 / div; // expected-note {{Division by zero}} \55 // expected-warning {{Division by zero}}56 }57} // namespace test_tracking_both_lhs_and_rhs58 59namespace test_tracking_of_multiplier_and_parens {60 int f(int x, int y, int z) {61 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \62 // expected-note {{'p0' initialized to 0}}63 int div = y*(z*p0); // expected-note {{'div' initialized to 0}}64 return 1 / div; // expected-note {{Division by zero}} \65 // expected-warning {{Division by zero}}66 }67} // namespace test_tracking_of_multiplier_and_parens68 69namespace test_tracking_of_divisible {70 int f(int x, int y) {71 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \72 // expected-note {{'p0' initialized to 0}}73 int div = p0 / y; // expected-note {{'div' initialized to 0}}74 return 1 / div; // expected-note {{Division by zero}} \75 // expected-warning {{Division by zero}}76 }77} // namespace test_tracking_of_divisible78 79namespace test_tracking_of_modulo {80 int f(int x, int y) {81 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \82 // expected-note {{'p0' initialized to 0}}83 int div = p0 % y; // expected-note {{'div' initialized to 0}}84 return 1 / div; // expected-note {{Division by zero}} \85 // expected-warning {{Division by zero}}86 }87} // namespace test_tracking_of_modulo88 89namespace test_tracking_of_assignment {90 int f(int x) {91 bool p0 = x < 0; // expected-note {{Assuming 'x' is >= 0}} \92 // expected-note {{'p0' initialized to 0}}93 int div = 1;94 div *= p0; // expected-note {{The value 0 is assigned to 'div'}}95 return 1 / div; // expected-note {{Division by zero}} \96 // expected-warning {{Division by zero}}97 }98} // namespace test_tracking_of_assignment99