1 // 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 2 3 int *p_a; 4 int bar(); 5 int flag_a; 6 int test_for_bug_25609() { 7 if (p_a == 0) // expected-note {{Assuming 'p_a' is equal to null}} 8 // expected-note@-1 {{Taking true branch}} 9 bar(); 10 for (int i = 0; // expected-note {{Loop condition is true. Entering loop body}} 11 // expected-note@-1 {{Loop condition is false. Execution continues on line 16}} 12 ++i, // expected-note {{Value assigned to 'p_a'}} 13 i < flag_a; 14 ++i) {} 15 16 *p_a = 25609; // no-crash expected-warning {{Dereference of null pointer (loaded from variable 'p_a')}} 17 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p_a')}} 18 return *p_a; 19 } 20 21 int flag_b; 22 int while_analyzer_output() { 23 flag_b = 100; 24 int num = 10; 25 while (flag_b-- > 0) { // expected-note {{Loop condition is true. Entering loop body}} 26 // expected-note@-1 {{Value assigned to 'num'}} 27 // expected-note@-2 {{Loop condition is false. Execution continues on line 30}} 28 num = flag_b; 29 } 30 if (num < 0) // expected-note {{Assuming 'num' is >= 0}} 31 // expected-note@-1 {{Taking false branch}} 32 flag_b = 0; 33 else if (num >= 1) // expected-note {{Assuming 'num' is < 1}} 34 // expected-note@-1 {{Taking false branch}} 35 flag_b = 50; 36 else 37 flag_b = 100; 38 return flag_b / num; // no-crash expected-warning {{Division by zero}} 39 // expected-note@-1 {{Division by zero}} 40 } 41 42 int flag_c; 43 int do_while_analyzer_output() { 44 int num = 10; 45 do { // expected-note {{Loop condition is true. Execution continues on line 47}} 46 // expected-note@-1 {{Loop condition is false. Exiting loop}} 47 num--; 48 } while (flag_c-- > 0); //expected-note {{Value assigned to 'num'}} 49 int local = 0; 50 if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} 51 // expected-note@-1 {{Taking true branch}} 52 local = 10 / num; // no-crash expected-warning {{Division by zero}} 53 // expected-note@-1 {{Division by zero}} 54 return local; 55 } 56 57 int flag_d; 58 int test_for_loop() { 59 int num = 10; 60 for (int i = 0; // expected-note {{Loop condition is true. Entering loop body}} 61 // expected-note@-1 {{Loop condition is false. Execution continues on line 67}} 62 new int(10), // expected-note {{Value assigned to 'num'}} 63 i < flag_d; 64 ++i) { 65 ++num; 66 } 67 if (num == 0) // expected-note {{Assuming 'num' is equal to 0}} 68 // expected-note@-1 {{Taking true branch}} 69 flag_d += 10; 70 return flag_d / num; // no-crash expected-warning {{Division by zero}} 71 // expected-note@-1 {{Division by zero}} 72 } 73