diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2018-09-26 00:17:14 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2018-09-26 00:17:14 +0000 |
commit | 8e0f894a0e674223969246d91e61416de9bfb133 (patch) | |
tree | 846a369fbbdec75f1774fa34ab108e07ea75c739 /test/Analysis/casts.cpp | |
parent | c531bbd2d9553f1f337d9deb8fe0a9b6905dd2f4 (diff) | |
download | clang-8e0f894a0e674223969246d91e61416de9bfb133.tar.gz |
[analyzer] Fix a crash on casting symbolic pointers to derived classes.
Commit r340984 causes a crash when a pointer to a completely unrelated type
UnrelatedT (eg., opaque struct pattern) is being casted from base class BaseT to
derived class DerivedT, which results in an ill-formed region
Derived{SymRegion{$<UnrelatedT x>}, DerivedT}.
Differential Revision: https://reviews.llvm.org/D52189
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343051 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis/casts.cpp')
-rw-r--r-- | test/Analysis/casts.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/Analysis/casts.cpp b/test/Analysis/casts.cpp index 9b3e294c77..2c29105279 100644 --- a/test/Analysis/casts.cpp +++ b/test/Analysis/casts.cpp @@ -70,5 +70,35 @@ void foo(B *b) { clang_analyzer_eval(c->x); // expected-warning{{UNKNOWN}} clang_analyzer_eval(c->y); // expected-warning{{TRUE}} } +} // namespace base_to_derived_double_inheritance + +namespace base_to_derived_opaque_class { +class NotInt { +public: + operator int() { return !x; } // no-crash + int x; +}; + +typedef struct Opaque *OpaqueRef; +typedef void *VeryOpaqueRef; + +class Transparent { +public: + int getNotInt() { return NI; } + NotInt NI; +}; + +class SubTransparent : public Transparent {}; + +SubTransparent *castToDerived(Transparent *TRef) { + return (SubTransparent *)TRef; } +void foo(OpaqueRef ORef) { + castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt(); +} + +void foo(VeryOpaqueRef ORef) { + castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt(); +} +} // namespace base_to_derived_opaque_class |