diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp | 5 | ||||
-rw-r--r-- | clang/test/Analysis/inner-pointer.cpp | 10 |
2 files changed, 11 insertions, 4 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp index b253e67cffd..3a8964bb8d3 100644 --- a/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp @@ -133,10 +133,7 @@ bool InnerPointerChecker::isCalledOnStringObject( return false; CXXRecordDecl *Decl = ObjTy->getAsCXXRecordDecl(); - if (!Decl || Decl->getName() != "basic_string") - return false; - - return true; + return Decl && Decl->getName() == "basic_string"; } bool InnerPointerChecker::isInvalidatingMemberFunction( diff --git a/clang/test/Analysis/inner-pointer.cpp b/clang/test/Analysis/inner-pointer.cpp index 6f9c8a8e8a0..fb8cc8ec33e 100644 --- a/clang/test/Analysis/inner-pointer.cpp +++ b/clang/test/Analysis/inner-pointer.cpp @@ -382,3 +382,13 @@ const char *escape_via_return_local() { // expected-note@-1 {{Inner pointer invalidated by call to destructor}} } // expected-warning {{Use of memory after it is freed}} // expected-note@-1 {{Use of memory after it is freed}} + + +char *c(); +class A {}; + +void no_CXXRecordDecl() { + A a, *b; + *(void **)&b = c() + 1; + *b = a; // no-crash +} |