1 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject -analyzer-config alpha.cplusplus.UninitializedObject:Pedantic=true -std=c++11 -DPEDANTIC -verify %s
3 // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.cplusplus.UninitializedObject -std=c++11 -verify %s
5 //===----------------------------------------------------------------------===//
6 // Concrete location tests.
7 //===----------------------------------------------------------------------===//
9 struct ConcreteIntLocTest {
12 ConcreteIntLocTest() : ptr(reinterpret_cast<int *>(0xDEADBEEF)) {}
15 void fConcreteIntLocTest() {
19 //===----------------------------------------------------------------------===//
20 // Null pointer tests.
21 //===----------------------------------------------------------------------===//
29 float *fptr = nullptr;
34 NullPtrTest() : ptr(nullptr), recPtr(nullptr) {
43 //===----------------------------------------------------------------------===//
44 // Heap pointer tests.
45 //===----------------------------------------------------------------------===//
47 class HeapPointerTest1 {
49 // TODO: we'd expect the note: {{uninitialized field 'this->recPtr->y'}}
51 // TODO: we'd expect the note: {{uninitialized field 'this->recPtr->y'}}
54 // TODO: we'd expect the note: {{uninitialized pointee 'this->fptr'}}
55 float *fptr = new float; // no-note
56 // TODO: we'd expect the note: {{uninitialized pointee 'this->ptr'}}
61 // TODO: we'd expect the warning: {{4 uninitialized fields}}
62 HeapPointerTest1() : ptr(new int), recPtr(new RecordType) { // no-note
66 void fHeapPointerTest1() {
70 class HeapPointerTest2 {
76 float *fptr = new float(); // initializes to 0
81 HeapPointerTest2() : ptr(new int{25}), recPtr(new RecordType{26, 27}) {
86 void fHeapPointerTest2() {
90 //===----------------------------------------------------------------------===//
91 // Stack pointer tests.
92 //===----------------------------------------------------------------------===//
94 class StackPointerTest1 {
106 StackPointerTest1(int *_ptr, StackPointerTest1::RecordType *_recPtr) : ptr(_ptr), recPtr(_recPtr) {
111 void fStackPointerTest1() {
113 StackPointerTest1::RecordType ok_rec{29, 30};
114 StackPointerTest1(&ok_a, &ok_rec); // 'a', 'rec.x', 'rec.y' uninitialized
118 class StackPointerTest2 {
121 int x; // expected-note{{uninitialized field 'this->recPtr->x'}}
122 int y; // expected-note{{uninitialized field 'this->recPtr->y'}}
126 int *ptr; // expected-note{{uninitialized pointee 'this->ptr'}}
130 StackPointerTest2(int *_ptr, RecordType *_recPtr) : ptr(_ptr), recPtr(_recPtr) { // expected-warning{{3 uninitialized fields}}
134 void fStackPointerTest2() {
136 StackPointerTest2::RecordType rec;
137 StackPointerTest2(&a, &rec); // 'a', 'rec.x', 'rec.y' uninitialized
140 class StackPointerTest2 {
152 StackPointerTest2(int *_ptr, RecordType *_recPtr) : ptr(_ptr), recPtr(_recPtr) {
156 void fStackPointerTest2() {
158 StackPointerTest2::RecordType rec;
159 StackPointerTest2(&a, &rec); // 'a', 'rec.x', 'rec.y' uninitialized
163 class UninitPointerTest {
169 int *ptr; // expected-note{{uninitialized pointer 'this->ptr'}}
173 UninitPointerTest() : recPtr(new RecordType{13, 13}) { // expected-warning{{1 uninitialized field}}
177 void fUninitPointerTest() {
181 struct CharPointerTest {
183 int dontGetFilteredByNonPedanticMode = 0;
185 CharPointerTest() : str("") {}
188 void fCharPointerTest() {
192 struct CyclicPointerTest {
194 CyclicPointerTest() : ptr(reinterpret_cast<int*>(&ptr)) {}
197 void fCyclicPointerTest() {
201 //===----------------------------------------------------------------------===//
202 // Void pointer tests.
203 //===----------------------------------------------------------------------===//
205 // Void pointer tests are mainly no-crash tests.
207 void *malloc(int size);
209 class VoidPointerTest1 {
213 VoidPointerTest1(void *vptr, char) : vptr(vptr) {
218 void fVoidPointerTest1() {
219 void *vptr = malloc(sizeof(int));
220 VoidPointerTest1(vptr, char());
223 class VoidPointerTest2 {
227 VoidPointerTest2(void **vpptr, char) : vpptr(vpptr) {
232 void fVoidPointerTest2() {
233 void *vptr = malloc(sizeof(int));
234 VoidPointerTest2(&vptr, char());
237 class VoidPointerRRefTest1 {
238 void *&&vptrrref; // expected-note {{here}}
241 VoidPointerRRefTest1(void *vptr, char) : vptrrref(static_cast<void *&&>(vptr)) { // expected-warning {{binding reference member 'vptrrref' to stack allocated parameter 'vptr'}}
246 void fVoidPointerRRefTest1() {
247 void *vptr = malloc(sizeof(int));
248 VoidPointerRRefTest1(vptr, char());
251 class VoidPointerRRefTest2 {
252 void **&&vpptrrref; // expected-note {{here}}
255 VoidPointerRRefTest2(void **vptr, char) : vpptrrref(static_cast<void **&&>(vptr)) { // expected-warning {{binding reference member 'vpptrrref' to stack allocated parameter 'vptr'}}
260 void fVoidPointerRRefTest2() {
261 void *vptr = malloc(sizeof(int));
262 VoidPointerRRefTest2(&vptr, char());
265 class VoidPointerLRefTest {
266 void *&vptrrref; // expected-note {{here}}
269 VoidPointerLRefTest(void *vptr, char) : vptrrref(static_cast<void *&>(vptr)) { // expected-warning {{binding reference member 'vptrrref' to stack allocated parameter 'vptr'}}
274 void fVoidPointerLRefTest() {
275 void *vptr = malloc(sizeof(int));
276 VoidPointerLRefTest(vptr, char());
279 struct CyclicVoidPointerTest {
280 void *vptr; // no-crash
282 CyclicVoidPointerTest() : vptr(&vptr) {}
286 void fCyclicVoidPointerTest() {
287 CyclicVoidPointerTest();
290 //===----------------------------------------------------------------------===//
291 // Multipointer tests.
292 //===----------------------------------------------------------------------===//
295 class MultiPointerTest1 {
303 RecordType **mptr; // expected-note{{uninitialized pointee 'this->mptr'}}
306 MultiPointerTest1(RecordType **p, int) : mptr(p) { // expected-warning{{1 uninitialized field}}
310 void fMultiPointerTest1() {
311 MultiPointerTest1::RecordType *p1;
312 MultiPointerTest1::RecordType **mptr = &p1;
313 MultiPointerTest1(mptr, int()); // '*mptr' uninitialized
316 class MultiPointerTest1 {
327 MultiPointerTest1(RecordType **p, int) : mptr(p) {}
330 void fMultiPointerTest1() {
331 MultiPointerTest1::RecordType *p1;
332 MultiPointerTest1::RecordType **mptr = &p1;
333 MultiPointerTest1(mptr, int()); // '*mptr' uninitialized
338 class MultiPointerTest2 {
341 int x; // expected-note{{uninitialized field 'this->mptr->x'}}
342 int y; // expected-note{{uninitialized field 'this->mptr->y'}}
349 MultiPointerTest2(RecordType **p, int) : mptr(p) { // expected-warning{{2 uninitialized fields}}
353 void fMultiPointerTest2() {
354 MultiPointerTest2::RecordType i;
355 MultiPointerTest2::RecordType *p1 = &i;
356 MultiPointerTest2::RecordType **mptr = &p1;
357 MultiPointerTest2(mptr, int()); // '**mptr' uninitialized
360 class MultiPointerTest2 {
371 MultiPointerTest2(RecordType **p, int) : mptr(p) {
375 void fMultiPointerTest2() {
376 MultiPointerTest2::RecordType i;
377 MultiPointerTest2::RecordType *p1 = &i;
378 MultiPointerTest2::RecordType **mptr = &p1;
379 MultiPointerTest2(mptr, int()); // '**mptr' uninitialized
383 class MultiPointerTest3 {
394 MultiPointerTest3(RecordType **p, int) : mptr(p) {
399 void fMultiPointerTest3() {
400 MultiPointerTest3::RecordType i{31, 32};
401 MultiPointerTest3::RecordType *p1 = &i;
402 MultiPointerTest3::RecordType **mptr = &p1;
403 MultiPointerTest3(mptr, int()); // '**mptr' uninitialized
406 //===----------------------------------------------------------------------===//
407 // Member pointer tests.
408 //===----------------------------------------------------------------------===//
410 struct UsefulFunctions {
418 struct PointerToMemberFunctionTest1 {
419 void (UsefulFunctions::*f)(void); // expected-note{{uninitialized field 'this->f'}}
420 PointerToMemberFunctionTest1() {}
423 void fPointerToMemberFunctionTest1() {
424 PointerToMemberFunctionTest1(); // expected-warning{{1 uninitialized field}}
427 struct PointerToMemberFunctionTest2 {
428 void (UsefulFunctions::*f)(void);
429 PointerToMemberFunctionTest2(void (UsefulFunctions::*f)(void)) : f(f) {
434 void fPointerToMemberFunctionTest2() {
435 void (UsefulFunctions::*f)(void) = &UsefulFunctions::print;
436 PointerToMemberFunctionTest2 a(f);
439 struct MultiPointerToMemberFunctionTest1 {
440 void (UsefulFunctions::**f)(void); // expected-note{{uninitialized pointer 'this->f'}}
441 MultiPointerToMemberFunctionTest1() {}
444 void fMultiPointerToMemberFunctionTest1() {
445 MultiPointerToMemberFunctionTest1(); // expected-warning{{1 uninitialized field}}
448 struct MultiPointerToMemberFunctionTest2 {
449 void (UsefulFunctions::**f)(void);
450 MultiPointerToMemberFunctionTest2(void (UsefulFunctions::**f)(void)) : f(f) {
455 void fMultiPointerToMemberFunctionTest2() {
456 void (UsefulFunctions::*f)(void) = &UsefulFunctions::print;
457 MultiPointerToMemberFunctionTest2 a(&f);
460 struct PointerToMemberDataTest1 {
461 int UsefulFunctions::*d; // expected-note{{uninitialized field 'this->d'}}
462 PointerToMemberDataTest1() {}
465 void fPointerToMemberDataTest1() {
466 PointerToMemberDataTest1(); // expected-warning{{1 uninitialized field}}
469 struct PointerToMemberDataTest2 {
470 int UsefulFunctions::*d;
471 PointerToMemberDataTest2(int UsefulFunctions::*d) : d(d) {
476 void fPointerToMemberDataTest2() {
477 int UsefulFunctions::*d = &UsefulFunctions::a;
478 PointerToMemberDataTest2 a(d);
481 struct MultiPointerToMemberDataTest1 {
482 int UsefulFunctions::**d; // expected-note{{uninitialized pointer 'this->d'}}
483 MultiPointerToMemberDataTest1() {}
486 void fMultiPointerToMemberDataTest1() {
487 MultiPointerToMemberDataTest1(); // expected-warning{{1 uninitialized field}}
490 struct MultiPointerToMemberDataTest2 {
491 int UsefulFunctions::**d;
492 MultiPointerToMemberDataTest2(int UsefulFunctions::**d) : d(d) {
497 void fMultiPointerToMemberDataTest2() {
498 int UsefulFunctions::*d = &UsefulFunctions::a;
499 MultiPointerToMemberDataTest2 a(&d);
503 //===----------------------------------------------------------------------===//
504 // Tests for list-like records.
505 //===----------------------------------------------------------------------===//
510 Node *next = nullptr; // no crash
515 Node *head = nullptr;
530 Node *next = nullptr;
531 int i; // expected-note{{uninitialized field 'this->head->i'}}
535 Node *head = nullptr;
538 ListTest2(Node *node, int) : head(node) { // expected-warning{{1 uninitialized field}}
544 ListTest2(&n, int());
550 Node *next = nullptr;
551 int i; // expected-note{{uninitialized field 'this->head->i'}}
555 Node *head = nullptr;
558 CyclicList(Node *node, int) : head(node) { // expected-warning{{1 uninitialized field}}
577 // note that n1.i is uninitialized
578 CyclicList(&n1, int());
581 //===----------------------------------------------------------------------===//
582 // Tests for classes containing references.
583 //===----------------------------------------------------------------------===//
585 class ReferenceTest1 {
597 ReferenceTest1(RecordType &lref, RecordType &rref) : lref(lref), rref(static_cast<RecordType &&>(rref)) {
602 void fReferenceTest1() {
603 ReferenceTest1::RecordType d{33, 34};
604 ReferenceTest1(d, d);
608 class ReferenceTest2 {
611 int x; // expected-note{{uninitialized field 'this->lref.x'}}
612 int y; // expected-note{{uninitialized field 'this->lref.y'}}
620 ReferenceTest2(RecordType &lref, RecordType &rref)
621 : lref(lref), rref(static_cast<RecordType &&>(rref)) { // expected-warning{{2 uninitialized fields}}
625 void fReferenceTest2() {
626 ReferenceTest2::RecordType c;
627 ReferenceTest2(c, c);
630 class ReferenceTest2 {
642 ReferenceTest2(RecordType &lref, RecordType &rref)
643 : lref(lref), rref(static_cast<RecordType &&>(rref)) {
647 void fReferenceTest2() {
648 ReferenceTest2::RecordType c;
649 ReferenceTest2(c, c);
653 class ReferenceTest3 {
656 int x; // expected-note{{uninitialized field 'this->lref.x'}}
657 int y; // expected-note{{uninitialized field 'this->lref.y'}}
665 ReferenceTest3(RecordType &lref, RecordType &rref)
666 : lref(lref), rref(static_cast<RecordType &&>(rref)) { // expected-warning{{2 uninitialized fields}}
670 void fReferenceTest3() {
671 ReferenceTest3::RecordType c, d{35, 36};
672 ReferenceTest3(c, d);
675 class ReferenceTest4 {
678 int x; // expected-note{{uninitialized field 'this->rref.x'}}
679 int y; // expected-note{{uninitialized field 'this->rref.y'}}
687 ReferenceTest4(RecordType &lref, RecordType &rref)
688 : lref(lref), rref(static_cast<RecordType &&>(rref)) { // expected-warning{{2 uninitialized fields}}
692 void fReferenceTest5() {
693 ReferenceTest4::RecordType c, d{37, 38};
694 ReferenceTest4(d, c);