1*afcb77ccSAdam Balogh // 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
29a2c14a7SDevin Coughlin 
39a2c14a7SDevin Coughlin int *p_a;
49a2c14a7SDevin Coughlin int bar();
59a2c14a7SDevin Coughlin int flag_a;
test_for_bug_25609()69a2c14a7SDevin Coughlin int test_for_bug_25609() {
79a2c14a7SDevin Coughlin   if (p_a == 0) // expected-note {{Assuming 'p_a' is equal to null}}
89a2c14a7SDevin Coughlin                 // expected-note@-1 {{Taking true branch}}
99a2c14a7SDevin Coughlin     bar();
109a2c14a7SDevin Coughlin   for (int i = 0;  // expected-note {{Loop condition is true.  Entering loop body}}
119a2c14a7SDevin Coughlin                    // expected-note@-1 {{Loop condition is false. Execution continues on line 16}}
129a2c14a7SDevin Coughlin        ++i,        // expected-note {{Value assigned to 'p_a'}}
139a2c14a7SDevin Coughlin        i < flag_a;
149a2c14a7SDevin Coughlin        ++i) {}
159a2c14a7SDevin Coughlin 
169a2c14a7SDevin Coughlin   *p_a = 25609; // no-crash expected-warning {{Dereference of null pointer (loaded from variable 'p_a')}}
179a2c14a7SDevin Coughlin                 // expected-note@-1 {{Dereference of null pointer (loaded from variable 'p_a')}}
189a2c14a7SDevin Coughlin   return *p_a;
199a2c14a7SDevin Coughlin }
209a2c14a7SDevin Coughlin 
219a2c14a7SDevin Coughlin int flag_b;
while_analyzer_output()229a2c14a7SDevin Coughlin int while_analyzer_output() {
239a2c14a7SDevin Coughlin   flag_b = 100;
249a2c14a7SDevin Coughlin   int num = 10;
259a2c14a7SDevin Coughlin   while (flag_b-- > 0) { // expected-note {{Loop condition is true.  Entering loop body}}
269a2c14a7SDevin Coughlin                          // expected-note@-1 {{Value assigned to 'num'}}
279a2c14a7SDevin Coughlin                          // expected-note@-2 {{Loop condition is false. Execution continues on line 30}}
289a2c14a7SDevin Coughlin     num = flag_b;
299a2c14a7SDevin Coughlin   }
309a2c14a7SDevin Coughlin   if (num < 0) // expected-note {{Assuming 'num' is >= 0}}
319a2c14a7SDevin Coughlin                // expected-note@-1 {{Taking false branch}}
329a2c14a7SDevin Coughlin     flag_b = 0;
339a2c14a7SDevin Coughlin   else if (num >= 1) // expected-note {{Assuming 'num' is < 1}}
349a2c14a7SDevin Coughlin                      // expected-note@-1 {{Taking false branch}}
359a2c14a7SDevin Coughlin     flag_b = 50;
369a2c14a7SDevin Coughlin   else
379a2c14a7SDevin Coughlin     flag_b = 100;
389a2c14a7SDevin Coughlin   return flag_b / num; // no-crash expected-warning {{Division by zero}}
399a2c14a7SDevin Coughlin                        // expected-note@-1 {{Division by zero}}
409a2c14a7SDevin Coughlin }
419a2c14a7SDevin Coughlin 
429a2c14a7SDevin Coughlin int flag_c;
do_while_analyzer_output()439a2c14a7SDevin Coughlin int do_while_analyzer_output() {
449a2c14a7SDevin Coughlin   int num = 10;
459a2c14a7SDevin Coughlin   do {   // expected-note {{Loop condition is true. Execution continues on line 47}}
469a2c14a7SDevin Coughlin          // expected-note@-1 {{Loop condition is false.  Exiting loop}}
479a2c14a7SDevin Coughlin     num--;
489a2c14a7SDevin Coughlin   } while (flag_c-- > 0); //expected-note {{Value assigned to 'num'}}
499a2c14a7SDevin Coughlin   int local = 0;
509a2c14a7SDevin Coughlin   if (num == 0)       // expected-note {{Assuming 'num' is equal to 0}}
519a2c14a7SDevin Coughlin                       // expected-note@-1 {{Taking true branch}}
529a2c14a7SDevin Coughlin     local = 10 / num; // no-crash expected-warning {{Division by zero}}
539a2c14a7SDevin Coughlin                       // expected-note@-1 {{Division by zero}}
549a2c14a7SDevin Coughlin   return local;
559a2c14a7SDevin Coughlin }
569a2c14a7SDevin Coughlin 
579a2c14a7SDevin Coughlin int flag_d;
test_for_loop()589a2c14a7SDevin Coughlin int test_for_loop() {
599a2c14a7SDevin Coughlin   int num = 10;
609a2c14a7SDevin Coughlin   for (int i = 0;    // expected-note {{Loop condition is true.  Entering loop body}}
619a2c14a7SDevin Coughlin                      // expected-note@-1 {{Loop condition is false. Execution continues on line 67}}
629a2c14a7SDevin Coughlin        new int(10),  // expected-note {{Value assigned to 'num'}}
639a2c14a7SDevin Coughlin        i < flag_d;
649a2c14a7SDevin Coughlin        ++i) {
659a2c14a7SDevin Coughlin     ++num;
669a2c14a7SDevin Coughlin   }
679a2c14a7SDevin Coughlin   if (num == 0) // expected-note {{Assuming 'num' is equal to 0}}
689a2c14a7SDevin Coughlin                 // expected-note@-1 {{Taking true branch}}
699a2c14a7SDevin Coughlin     flag_d += 10;
709a2c14a7SDevin Coughlin   return flag_d / num; // no-crash expected-warning {{Division by zero}}
719a2c14a7SDevin Coughlin                        // expected-note@-1 {{Division by zero}}
729a2c14a7SDevin Coughlin }
73