Clang Project

clang_source_code/test/Analysis/new-ctor-conservative.cpp
1// 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
2
3void clang_analyzer_eval(bool);
4void clang_analyzer_warnIfReached();
5
6struct S {
7  int x;
8  S() : x(1) {}
9  ~S() {}
10};
11
12void checkConstructorInlining() {
13  S *s = new S;
14  clang_analyzer_eval(s->x == 1); // expected-warning{{TRUE}}
15}
16
17void checkNewPOD() {
18  int *i = new int;
19  clang_analyzer_eval(*i == 0); // expected-warning{{UNKNOWN}}
20  int *j = new int();
21  clang_analyzer_eval(*j == 0); // expected-warning{{TRUE}}
22  int *k = new int(5);
23  clang_analyzer_eval(*k == 5); // expected-warning{{TRUE}}
24}
25
26void checkNewArray() {
27  S *s = new S[10];
28  // FIXME: Should be true once we inline array constructors.
29  clang_analyzer_eval(s[0].x == 1); // expected-warning{{UNKNOWN}}
30}
31
32struct NullS {
33  NullS() {
34    if (this) {}
35  }
36  NullS(int x) {
37    if (!this) {
38      clang_analyzer_warnIfReached(); // no-warning
39    }
40  }
41};
42
43void checkNullThis() {
44  NullS *nulls = new NullS(); // no-crash
45  NullS *nulls2 = new NullS(0);
46}
47