| // RUN: %clang_cc1 -fsyntax-only -analyze \ |
| // RUN: -analyzer-checker=core,debug.ExprInspection %s -verify |
| |
| // These test cases demonstrate lack of Static Analyzer features. |
| // The FIXME: tags indicate where we expect different output. |
| |
| // Handle constructors within new[]. |
| |
| // When an array of objects is allocated using the operator new[], |
| // constructors for all elements of the array are called. |
| // We should model (potentially some of) such evaluations, |
| // and the same applies for destructors called from operator delete[]. |
| |
| void clang_analyzer_eval(bool); |
| |
| struct init_with_list { |
| int a; |
| init_with_list() : a(1) {} |
| }; |
| |
| struct init_in_body { |
| int a; |
| init_in_body() { a = 1; } |
| }; |
| |
| struct init_default_member { |
| int a = 1; |
| }; |
| |
| void test_automatic() { |
| |
| init_with_list a1; |
| init_in_body a2; |
| init_default_member a3; |
| |
| clang_analyzer_eval(a1.a == 1); // expected-warning {{TRUE}} |
| clang_analyzer_eval(a2.a == 1); // expected-warning {{TRUE}} |
| clang_analyzer_eval(a3.a == 1); // expected-warning {{TRUE}} |
| } |
| |
| void test_dynamic() { |
| |
| auto *a1 = new init_with_list; |
| auto *a2 = new init_in_body; |
| auto *a3 = new init_default_member; |
| |
| clang_analyzer_eval(a1->a == 1); // expected-warning {{TRUE}} |
| clang_analyzer_eval(a2->a == 1); // expected-warning {{TRUE}} |
| clang_analyzer_eval(a3->a == 1); // expected-warning {{TRUE}} |
| |
| delete a1; |
| delete a2; |
| delete a3; |
| } |
| |
| void test_automatic_aggregate() { |
| |
| init_with_list a1[1]; |
| init_in_body a2[1]; |
| init_default_member a3[1]; |
| |
| // FIXME: Should be TRUE, not FALSE. |
| clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| // FIXME: Should be TRUE, not FALSE. |
| clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| // FIXME: Should be TRUE, not FALSE. |
| clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| } |
| |
| void test_dynamic_aggregate() { |
| |
| auto *a1 = new init_with_list[1]; |
| auto *a2 = new init_in_body[1]; |
| auto *a3 = new init_default_member[1]; |
| |
| // FIXME: Should be TRUE, not FALSE. |
| clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| // FIXME: Should be TRUE, not FALSE. |
| clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| // FIXME: Should be TRUE, not FALSE. |
| clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}} expected-warning {{FALSE}} |
| |
| delete[] a1; |
| delete[] a2; |
| delete[] a3; |
| } |