// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-ipa=inlining -analyzer-output=text -verify %s // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-ipa=inlining -analyzer-output=plist-multi-file %s -o - | FileCheck %s // Test warning about null or uninitialized pointer values used as instance member // calls. class TestInstanceCall { public: void foo() {} }; void test_ic() { TestInstanceCall *p; // expected-note {{Variable 'p' declared without an initial value}} p->foo(); // expected-warning {{Called C++ object pointer is uninitialized}} expected-note {{Called C++ object pointer is uninitialized}} } void test_ic_null() { TestInstanceCall *p = 0; // expected-note {{Variable 'p' initialized to a null pointer value}} p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}} } void test_ic_set_to_null() { TestInstanceCall *p; p = 0; // expected-note {{Null pointer value stored to 'p'}} p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note {{Called C++ object pointer is null}} } void test_ic_null(TestInstanceCall *p) { if (!p) // expected-note {{Assuming pointer value is null}} expected-note {{Taking true branch}} p->foo(); // expected-warning {{Called C++ object pointer is null}} expected-note{{Called C++ object pointer is null}} } void test_ic_member_ptr() { TestInstanceCall *p = 0; // expected-note {{Variable 'p' initialized to a null pointer value}} typedef void (TestInstanceCall::*IC_Ptr)(); IC_Ptr bar = &TestInstanceCall::foo; (p->*bar)(); // expected-warning {{Called C++ object pointer is null}} expected-note{{Called C++ object pointer is null}} } // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: files // CHECK: // CHECK: {{.*}}method-call-path-notes.cpp // CHECK: // CHECK: diagnostics // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col21 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Variable 'p' declared without an initial value // CHECK: message // CHECK: Variable 'p' declared without an initial value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line12 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line13 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line13 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line13 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line13 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line13 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Called C++ object pointer is uninitialized // CHECK: message // CHECK: Called C++ object pointer is uninitialized // CHECK: // CHECK: // CHECK: descriptionCalled C++ object pointer is uninitialized // CHECK: categoryLogic error // CHECK: typeCalled C++ object pointer is uninitialized // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_ic // CHECK: issue_hash2 // CHECK: location // CHECK: // CHECK: line13 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line17 // CHECK: col21 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line17 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line17 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Called C++ object pointer is null // CHECK: message // CHECK: Called C++ object pointer is null // CHECK: // CHECK: // CHECK: descriptionCalled C++ object pointer is null // CHECK: categoryLogic error // CHECK: typeCalled C++ object pointer is null // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_ic_null // CHECK: issue_hash2 // CHECK: location // CHECK: // CHECK: line18 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line22 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line22 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Null pointer value stored to 'p' // CHECK: message // CHECK: Null pointer value stored to 'p' // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line24 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line24 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line24 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line24 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line24 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Called C++ object pointer is null // CHECK: message // CHECK: Called C++ object pointer is null // CHECK: // CHECK: // CHECK: descriptionCalled C++ object pointer is null // CHECK: categoryLogic error // CHECK: typeCalled C++ object pointer is null // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_ic_set_to_null // CHECK: issue_hash3 // CHECK: location // CHECK: // CHECK: line24 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line28 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line28 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line28 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line28 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line28 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line28 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line28 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Assuming pointer value is null // CHECK: message // CHECK: Assuming pointer value is null // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line28 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: line28 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Called C++ object pointer is null // CHECK: message // CHECK: Called C++ object pointer is null // CHECK: // CHECK: // CHECK: descriptionCalled C++ object pointer is null // CHECK: categoryLogic error // CHECK: typeCalled C++ object pointer is null // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_ic_null // CHECK: issue_hash2 // CHECK: location // CHECK: // CHECK: line29 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line33 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line33 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line33 // CHECK: col21 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line33 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line33 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line36 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Called C++ object pointer is null // CHECK: message // CHECK: Called C++ object pointer is null // CHECK: // CHECK: // CHECK: descriptionCalled C++ object pointer is null // CHECK: categoryLogic error // CHECK: typeCalled C++ object pointer is null // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_ic_member_ptr // CHECK: issue_hash4 // CHECK: location // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: