|  | // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core -analyzer-max-loop 2 -analyzer-config widen-loops=true -analyzer-output=text -verify -analyzer-config eagerly-assume=false %s | 
|  |  | 
|  | int *p_a; | 
|  | int bar(); | 
|  | int flag_a; | 
|  | int test_for_bug_25609() { | 
|  | if (p_a == 0) // expected-note {{Assuming 'p_a' is equal to null}} | 
|  | // expected-note@-1 {{Taking true branch}} | 
|  | bar(); | 
|  | for (int i = 0;  // expected-note {{Loop condition is true.  Entering loop body}} | 
|  | // expected-note@-1 {{Loop condition is false. Execution continues on line 16}} | 
|  | ++i,        // expected-note {{Value assigned to 'p_a'}} | 
|  | i < flag_a; | 
|  | ++i) {} | 
|  |  | 
|  | *p_a = 25609; // no-crash expected-warning {{Dereference of null pointer (loaded from variable 'p_a')}} | 
|  | // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p_a')}} | 
|  | return *p_a; | 
|  | } | 
|  |  | 
|  | int flag_b; | 
|  | int while_analyzer_output() { | 
|  | flag_b = 100; | 
|  | int num = 10; | 
|  | while (flag_b-- > 0) { // expected-note {{Loop condition is true.  Entering loop body}} | 
|  | // expected-note@-1 {{Value assigned to 'num'}} | 
|  | // expected-note@-2 {{Loop condition is false. Execution continues on line 30}} | 
|  | num = flag_b; | 
|  | } | 
|  | if (num < 0) // expected-note {{Assuming 'num' is >= 0}} | 
|  | // expected-note@-1 {{Taking false branch}} | 
|  | flag_b = 0; | 
|  | else if (num >= 1) // expected-note {{Assuming 'num' is < 1}} | 
|  | // expected-note@-1 {{Taking false branch}} | 
|  | flag_b = 50; | 
|  | else | 
|  | flag_b = 100; | 
|  | return flag_b / num; // no-crash expected-warning {{Division by zero}} | 
|  | // expected-note@-1 {{Division by zero}} | 
|  | } | 
|  |  | 
|  | int flag_c; | 
|  | int do_while_analyzer_output() { | 
|  | int num = 10; | 
|  | do {   // expected-note {{Loop condition is true. Execution continues on line 47}} | 
|  | // expected-note@-1 {{Loop condition is false.  Exiting loop}} | 
|  | num--; | 
|  | } while (flag_c-- > 0); //expected-note {{Value assigned to 'num'}} | 
|  | int local = 0; | 
|  | if (num == 0)       // expected-note {{Assuming 'num' is equal to 0}} | 
|  | // expected-note@-1 {{Taking true branch}} | 
|  | local = 10 / num; // no-crash expected-warning {{Division by zero}} | 
|  | // expected-note@-1 {{Division by zero}} | 
|  | return local; | 
|  | } | 
|  |  | 
|  | int flag_d; | 
|  | int test_for_loop() { | 
|  | int num = 10; | 
|  | for (int i = 0;    // expected-note {{Loop condition is true.  Entering loop body}} | 
|  | // expected-note@-1 {{Loop condition is false. Execution continues on line 67}} | 
|  | new int(10),  // expected-note {{Value assigned to 'num'}} | 
|  | i < flag_d; | 
|  | ++i) { | 
|  | ++num; | 
|  | } | 
|  | if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} | 
|  | // expected-note@-1 {{Taking true branch}} | 
|  | flag_d += 10; | 
|  | return flag_d / num; // no-crash expected-warning {{Division by zero}} | 
|  | // expected-note@-1 {{Division by zero}} | 
|  | } | 
|  |  | 
|  | int test_for_range_loop() { | 
|  | int arr[10] = {0}; | 
|  | for(auto x : arr) { // expected-note {{Assigning value}} | 
|  | ++x; | 
|  | } | 
|  | if (arr[0] == 0)   // expected-note {{Assuming the condition is true}} | 
|  | // expected-note@-1 {{Taking true branch}} | 
|  | return 1/arr[0]; // expected-warning {{Division by zero}} | 
|  | // expected-note@-1 {{Division by zero}} | 
|  | return 0; | 
|  | } |