blob: 92d581b82a31de3118b744c9d4f62262eab31ce8 [file] [log] [blame]
Jordan Rosede5277f2012-08-31 17:06:49 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-ipa=inlining -analyzer-config c++-inlining=constructors -std=c++11 -verify %s
Jordy Rose43d9f0d2012-05-16 16:01:10 +00002
3void clang_analyzer_eval(bool);
Zhongxing Xu9dc84c92010-11-16 07:52:17 +00004
5class A {
6 int x;
7public:
8 A();
9};
10
11A::A() : x(0) {
Jordy Rose43d9f0d2012-05-16 16:01:10 +000012 clang_analyzer_eval(x == 0); // expected-warning{{TRUE}}
Zhongxing Xu9dc84c92010-11-16 07:52:17 +000013}
Jordan Rose3a0a9e32012-07-26 20:04:21 +000014
15
16class DirectMember {
17 int x;
18public:
19 DirectMember(int value) : x(value) {}
20
21 int getX() { return x; }
22};
23
24void testDirectMember() {
25 DirectMember obj(3);
26 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
27}
28
29
30class IndirectMember {
31 struct {
32 int x;
33 };
34public:
35 IndirectMember(int value) : x(value) {}
36
37 int getX() { return x; }
38};
39
40void testIndirectMember() {
41 IndirectMember obj(3);
42 clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}}
43}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000044
45
Jordan Rose563ea232012-08-03 23:31:15 +000046struct DelegatingConstructor {
47 int x;
48 DelegatingConstructor(int y) { x = y; }
49 DelegatingConstructor() : DelegatingConstructor(42) {}
50};
51
52void testDelegatingConstructor() {
53 DelegatingConstructor obj;
54 clang_analyzer_eval(obj.x == 42); // expected-warning{{TRUE}}
55}
56
57
Jordan Rose9f3b9d52012-08-02 21:33:42 +000058struct RefWrapper {
59 RefWrapper(int *p) : x(*p) {}
60 RefWrapper(int &r) : x(r) {}
61 int &x;
62};
63
64void testReferenceMember() {
65 int *p = 0;
Jordan Rosede5277f2012-08-31 17:06:49 +000066 RefWrapper X(p); // expected-warning@-7 {{Dereference of null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000067}
68
69void testReferenceMember2() {
70 int *p = 0;
Jordan Rose3682f1e2012-08-25 01:06:23 +000071 // FIXME: We should warn here, since we're creating the reference here.
Jordan Rosede5277f2012-08-31 17:06:49 +000072 RefWrapper X(*p); // expected-warning@-12 {{Dereference of null pointer}}
Jordan Rose9f3b9d52012-08-02 21:33:42 +000073}
Jordan Rose3682f1e2012-08-25 01:06:23 +000074
75
76extern "C" char *strdup(const char *);
77
78class StringWrapper {
79 char *str;
80public:
81 StringWrapper(const char *input) : str(strdup(input)) {} // no-warning
82};