summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2018-08-30 18:45:05 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2018-08-30 18:45:05 +0000
commit73b38668ce738f182a441d8e77be20be9ba7898a (patch)
tree10b905a9a38fd87019085b15f61c44b57f614144
parentd9b6b81d08fd8588566499d475f4d4499cd74511 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--clang/test/Analysis/inner-pointer.cpp4
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();
+}
OpenPOWER on IntegriCloud