19cbfdde2SValeriy Savchenko // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s 29cbfdde2SValeriy Savchenko 39cbfdde2SValeriy Savchenko // rdar://problem/64202361 49cbfdde2SValeriy Savchenko 59cbfdde2SValeriy Savchenko struct A { 69cbfdde2SValeriy Savchenko int a; 79cbfdde2SValeriy Savchenko struct { 89cbfdde2SValeriy Savchenko struct { 99cbfdde2SValeriy Savchenko int b; 109cbfdde2SValeriy Savchenko union { 119cbfdde2SValeriy Savchenko int c; 129cbfdde2SValeriy Savchenko }; 139cbfdde2SValeriy Savchenko }; 149cbfdde2SValeriy Savchenko }; 159cbfdde2SValeriy Savchenko }; 169cbfdde2SValeriy Savchenko testCrash()179cbfdde2SValeriy Savchenkoint testCrash() { 189cbfdde2SValeriy Savchenko int *x = 0; 199cbfdde2SValeriy Savchenko int A::*ap = &A::a; 209cbfdde2SValeriy Savchenko 219cbfdde2SValeriy Savchenko if (ap) // no crash 229cbfdde2SValeriy Savchenko return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} 239cbfdde2SValeriy Savchenko 249cbfdde2SValeriy Savchenko return 10; 259cbfdde2SValeriy Savchenko } 269cbfdde2SValeriy Savchenko testIndirectCrash()279cbfdde2SValeriy Savchenkoint testIndirectCrash() { 289cbfdde2SValeriy Savchenko int *x = 0; 299cbfdde2SValeriy Savchenko int A::*cp = &A::c; 309cbfdde2SValeriy Savchenko 319cbfdde2SValeriy Savchenko if (cp) // no crash 329cbfdde2SValeriy Savchenko return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} 339cbfdde2SValeriy Savchenko 349cbfdde2SValeriy Savchenko return 10; 359cbfdde2SValeriy Savchenko } 36*497b1b95SDenys Petrov 37*497b1b95SDenys Petrov // PR46264 38*497b1b95SDenys Petrov // This case shall not crash with an assertion failure about void* dereferening. 39*497b1b95SDenys Petrov namespace ns1 { 40*497b1b95SDenys Petrov namespace a { 41*497b1b95SDenys Petrov class b { 42*497b1b95SDenys Petrov public: 43*497b1b95SDenys Petrov typedef int b::*c; operator c()44*497b1b95SDenys Petrov operator c() { return d ? &b::d : 0; } 45*497b1b95SDenys Petrov int d; 46*497b1b95SDenys Petrov }; 47*497b1b95SDenys Petrov } // namespace a 48*497b1b95SDenys Petrov using a::b; 49*497b1b95SDenys Petrov class e { 50*497b1b95SDenys Petrov void f(); 51*497b1b95SDenys Petrov void g(); 52*497b1b95SDenys Petrov b h; 53*497b1b95SDenys Petrov }; f()54*497b1b95SDenys Petrovvoid e::f() { 55*497b1b95SDenys Petrov e *i; 56*497b1b95SDenys Petrov if (h) 57*497b1b95SDenys Petrov i->g(); // expected-warning{{Called C++ object pointer is uninitialized}} 58*497b1b95SDenys Petrov } 59*497b1b95SDenys Petrov } // namespace ns1 60