Files
clang-p2996/clang/test/Analysis/handle_constructors_with_new_array.cpp
isuckatcs b032e3ff61 [analyzer] Evaluate construction of non-POD type arrays
Introducing the support for evaluating the constructor
of every element in an array. The idea is to record the
index of the current array member being constructed and
create a loop during the analysis. We looping over the
same CXXConstructExpr as many times as many elements
the array has.

Differential Revision: https://reviews.llvm.org/D127973
2022-07-14 23:30:21 +02:00

81 lines
2.0 KiB
C++

// 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];
clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}}
clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}}
clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}}
}
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];
clang_analyzer_eval(a1[0].a == 1); // expected-warning {{TRUE}}
clang_analyzer_eval(a2[0].a == 1); // expected-warning {{TRUE}}
clang_analyzer_eval(a3[0].a == 1); // expected-warning {{TRUE}}
delete[] a1;
delete[] a2;
delete[] a3;
}