mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 20:15:49 -04:00

Due to RVO the target region of a function that returns an object by value isn't necessarily a temporary object region; it may be an arbitrary memory region. In particular, it may be a field of a bigger object. Make sure we don't invalidate the bigger object when said function is evaluated conservatively. Differential Revision: https://reviews.llvm.org/D63968 llvm-svn: 364870
26 lines
550 B
C++
26 lines
550 B
C++
// RUN: %clang_analyze_cc1 -analyzer-checker core,cplusplus \
|
|
// 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'}}
|
|
}
|