2018-08-30 04:29:17 +08:00
|
|
|
// RUN: %clang_analyze_cc1 -w -x c++ -analyzer-checker=core -analyzer-output=text -verify %s
|
2017-09-27 17:33:37 +08:00
|
|
|
|
|
|
|
namespace pr34731 {
|
|
|
|
int b;
|
|
|
|
class c {
|
|
|
|
class B {
|
|
|
|
public:
|
|
|
|
double ***d;
|
|
|
|
B();
|
|
|
|
};
|
|
|
|
void e(double **, int);
|
|
|
|
void f(B &, int &);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Properly track the null pointer in the array field back to the default
|
|
|
|
// constructor of 'h'.
|
|
|
|
void c::f(B &g, int &i) {
|
|
|
|
e(g.d[9], i); // expected-warning{{Array access (via field 'd') results in a null pointer dereference}}
|
|
|
|
// expected-note@-1{{Array access (via field 'd') results in a null pointer dereference}}
|
|
|
|
B h, a; // expected-note{{Value assigned to 'h.d'}}
|
|
|
|
a.d == __null; // expected-note{{Assuming the condition is true}}
|
2019-05-30 04:29:02 +08:00
|
|
|
a.d != h.d; // expected-note{{Assuming 'a.d' is equal to 'h.d'}}
|
2017-09-27 17:33:37 +08:00
|
|
|
f(h, b); // expected-note{{Calling 'c::f'}}
|
|
|
|
}
|
|
|
|
}
|