1184c6242SDominic Chen // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s 239165091SGeorge Karpenkov // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=plist-multi-file %s -o %t.plist 3*61c848d2SHubert Tong // RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/method-call-path-notes.cpp.plist - 492e1449bSJordan Rose 592e1449bSJordan Rose // Test warning about null or uninitialized pointer values used as instance member 692e1449bSJordan Rose // calls. 792e1449bSJordan Rose class TestInstanceCall { 892e1449bSJordan Rose public: foo()992e1449bSJordan Rose void foo() {} 1092e1449bSJordan Rose }; 1192e1449bSJordan Rose test_ic()1292e1449bSJordan Rosevoid test_ic() { 1337c777ecSTed Kremenek TestInstanceCall *p; // expected-note {{'p' declared without an initial value}} 1492e1449bSJordan Rose p->foo(); // expected-warning {{Called C++ object pointer is uninitialized}} expected-note {{Called C++ object pointer is uninitialized}} 1592e1449bSJordan Rose } 1692e1449bSJordan Rose test_ic_null()1792e1449bSJordan Rosevoid test_ic_null() { 1837c777ecSTed Kremenek TestInstanceCall *p = 0; // expected-note {{'p' initialized to a null pointer value}} 1992e1449bSJordan Rose p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}} 2092e1449bSJordan Rose } 2192e1449bSJordan Rose test_ic_set_to_null()2292e1449bSJordan Rosevoid test_ic_set_to_null() { 2392e1449bSJordan Rose TestInstanceCall *p; 2492e1449bSJordan Rose p = 0; // expected-note {{Null pointer value stored to 'p'}} 2592e1449bSJordan Rose p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}} 2692e1449bSJordan Rose } 2792e1449bSJordan Rose test_ic_null(TestInstanceCall * p)2892e1449bSJordan Rosevoid test_ic_null(TestInstanceCall *p) { 29a5958869STed Kremenek if (!p) // expected-note {{Assuming 'p' is null}} expected-note {{Taking true branch}} 3092e1449bSJordan Rose p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note{{Called C++ object pointer is null}} 3192e1449bSJordan Rose } 3292e1449bSJordan Rose test_ic_member_ptr()3392e1449bSJordan Rosevoid test_ic_member_ptr() { 3437c777ecSTed Kremenek TestInstanceCall *p = 0; // expected-note {{'p' initialized to a null pointer value}} 3592e1449bSJordan Rose typedef void (TestInstanceCall::*IC_Ptr)(); 3692e1449bSJordan Rose IC_Ptr bar = &TestInstanceCall::foo; 3792e1449bSJordan Rose (p->*bar)(); // expected-warning {{Called C++ object pointer is null}} expected-note{{Called C++ object pointer is null}} 3892e1449bSJordan Rose } 39a3e3343eSJordan Rose test_cast(const TestInstanceCall * p)406ee44e1fSJordan Rosevoid test_cast(const TestInstanceCall *p) { 41a5958869STed Kremenek if (!p) // expected-note {{Assuming 'p' is null}} expected-note {{Taking true branch}} 426ee44e1fSJordan Rose const_cast<TestInstanceCall *>(p)->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}} 436ee44e1fSJordan Rose } 446ee44e1fSJordan Rose 45