// 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}} }