diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2018-08-30 18:45:05 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2018-08-30 18:45:05 +0000 |
commit | 73b38668ce738f182a441d8e77be20be9ba7898a (patch) | |
tree | 10b905a9a38fd87019085b15f61c44b57f614144 | |
parent | d9b6b81d08fd8588566499d475f4d4499cd74511 (diff) | |
download | bcm5719-llvm-73b38668ce738f182a441d8e77be20be9ba7898a.tar.gz bcm5719-llvm-73b38668ce738f182a441d8e77be20be9ba7898a.zip |
[analyzer] InnerPointerChecker: Fix a segfault when checking symbolic strings.
Return value of dyn_cast_or_null should be checked before use.
Otherwise we may put a null pointer into the map as a key and eventually
crash in checkDeadSymbols.
Differential Revision: https://reviews.llvm.org/D51385
llvm-svn: 341092
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp | 3 | ||||
-rw-r--r-- | clang/test/Analysis/inner-pointer.cpp | 4 |
2 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp index 91805e40a3d..b3638d0b9cf 100644 --- a/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/InnerPointerChecker.cpp @@ -211,8 +211,11 @@ void InnerPointerChecker::checkPostCall(const CallEvent &Call, ProgramStateRef State = C.getState(); if (const auto *ICall = dyn_cast<CXXInstanceCall>(&Call)) { + // TODO: Do we need these to be typed? const auto *ObjRegion = dyn_cast_or_null<TypedValueRegion>( ICall->getCXXThisVal().getAsRegion()); + if (!ObjRegion) + return; if (Call.isCalled(CStrFn) || Call.isCalled(DataFn)) { SVal RawPtr = Call.getReturnValue(); diff --git a/clang/test/Analysis/inner-pointer.cpp b/clang/test/Analysis/inner-pointer.cpp index 950270b2962..f8f6c11baef 100644 --- a/clang/test/Analysis/inner-pointer.cpp +++ b/clang/test/Analysis/inner-pointer.cpp @@ -424,3 +424,7 @@ void no_CXXRecordDecl() { *(void **)&b = c() + 1; *b = a; // no-crash } + +void checkReference(std::string &s) { + const char *c = s.c_str(); +} |