2019-10-19 08:08:17 +08:00
|
|
|
// RUN: %clang_analyze_cc1 -analyzer-checker core,cplusplus -std=c++14 \
|
2019-07-02 07:02:18 +08:00
|
|
|
// RUN: -analyzer-checker debug.ExprInspection -verify %s
|
|
|
|
|
|
|
|
void clang_analyzer_eval(bool);
|
|
|
|
|
|
|
|
struct A {
|
|
|
|
int x;
|
|
|
|
};
|
|
|
|
|
|
|
|
A getA();
|
|
|
|
|
|
|
|
struct B {
|
|
|
|
int *p;
|
|
|
|
A a;
|
|
|
|
|
|
|
|
B(int *p) : p(p), a(getA()) {}
|
|
|
|
};
|
|
|
|
|
|
|
|
void foo() {
|
|
|
|
B b1(nullptr);
|
|
|
|
clang_analyzer_eval(b1.p == nullptr); // expected-warning{{TRUE}}
|
|
|
|
B b2(new int); // No leak yet!
|
|
|
|
clang_analyzer_eval(b2.p == nullptr); // expected-warning{{FALSE}}
|
|
|
|
// expected-warning@-1{{Potential leak of memory pointed to by 'b2.p'}}
|
|
|
|
}
|