diff options
| author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-07-01 23:02:18 +0000 |
|---|---|---|
| committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-07-01 23:02:18 +0000 |
| commit | ceb639dbeea97c901b2642ebe296eb358d27b2f6 (patch) | |
| tree | a8a86d4fe063869ad50940409ed31bb73f952923 /clang/test/Analysis | |
| parent | 512f4838c47c5bab13d8bb0eabc01d64222825ae (diff) | |
| download | bcm5719-llvm-ceb639dbeea97c901b2642ebe296eb358d27b2f6.tar.gz bcm5719-llvm-ceb639dbeea97c901b2642ebe296eb358d27b2f6.zip | |
[analyzer] Fix invalidation when returning into a ctor initializer.
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
Diffstat (limited to 'clang/test/Analysis')
| -rw-r--r-- | clang/test/Analysis/rvo.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/Analysis/rvo.cpp b/clang/test/Analysis/rvo.cpp new file mode 100644 index 00000000000..cf06a9570b3 --- /dev/null +++ b/clang/test/Analysis/rvo.cpp @@ -0,0 +1,25 @@ +// 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'}} +} |

