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 Coughlinint 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 Coughlinint 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 Coughlinint 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 Coughlinint 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