llvm-project/clang/test/Analysis/new-ctor-conservative.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

53 lines
1.3 KiB
C++

// RUN: %clang_analyze_cc1 -w -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-allocator-inlining=true -std=c++11 -verify -analyzer-config eagerly-assume=false %s
void clang_analyzer_eval(bool);
void clang_analyzer_warnIfReached();
struct S {
int x;
S() : x(1) {}
~S() {}
};
void checkConstructorInlining() {
S *s = new S;
clang_analyzer_eval(s->x == 1); // expected-warning{{TRUE}}
}
void checkNewPOD() {
int *i = new int;
clang_analyzer_eval(*i == 0); // expected-warning{{UNKNOWN}}
int *j = new int();
clang_analyzer_eval(*j == 0); // expected-warning{{TRUE}}
int *k = new int(5);
clang_analyzer_eval(*k == 5); // expected-warning{{TRUE}}
}
void checkNewArray() {
S *s = new S[10];
// FIXME: Handle big array construction
clang_analyzer_eval(s[0].x == 1); // expected-warning{{UNKNOWN}}
clang_analyzer_eval(s[1].x == 1); // expected-warning{{UNKNOWN}}
s = new S[4];
clang_analyzer_eval(s[0].x == 1); // expected-warning{{TRUE}}
clang_analyzer_eval(s[1].x == 1); // expected-warning{{TRUE}}
}
struct NullS {
NullS() {
if (this) {}
}
NullS(int x) {
if (!this) {
clang_analyzer_warnIfReached(); // no-warning
}
}
};
void checkNullThis() {
NullS *nulls = new NullS(); // no-crash
NullS *nulls2 = new NullS(0);
}