summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2017-01-12 18:00:03 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2017-01-12 18:00:03 +0000
commit1d4fb84d82624cb7ca158c97a54116c692fe95df (patch)
tree8690e6151eb0a4a33f3358373f7609572248ca99 /clang/lib
parent18e165f50d8c1ab3afe7098dc00557d5f1a43cfa (diff)
downloadbcm5719-llvm-1d4fb84d82624cb7ca158c97a54116c692fe95df.tar.gz
bcm5719-llvm-1d4fb84d82624cb7ca158c97a54116c692fe95df.zip
[analyzer] Don't dereference the array value when binding it to a reference.
This replaces the hack in r291754, which was fixing pr31592, which was caused by r291754, with a more appropriate solution. rdar://problem/28832541 Differential revision: https://reviews.llvm.org/D28602 llvm-svn: 291781
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp6
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExprEngine.cpp5
2 files changed, 3 insertions, 8 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
index a98d379bb84..152b937bb03 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
@@ -253,12 +253,6 @@ void DereferenceChecker::checkBind(SVal L, SVal V, const Stmt *S,
if (!TVR->getValueType()->isReferenceType())
return;
- // FIXME: This is a hotfix for https://llvm.org/bugs/show_bug.cgi?id=31592
- // A proper fix is very much necessary. Otherwise we would never normally bind
- // a NonLoc to a reference.
- if (V.getAs<NonLoc>())
- return;
-
ProgramStateRef State = C.getState();
ProgramStateRef StNonNull, StNull;
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
index 0dd8469f278..d563f8e9eac 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
@@ -515,8 +515,9 @@ void ExprEngine::ProcessInitializer(const CFGInitializer Init,
Init = ASE->getBase()->IgnoreImplicit();
SVal LValue = State->getSVal(Init, stackFrame);
- if (Optional<Loc> LValueLoc = LValue.getAs<Loc>())
- InitVal = State->getSVal(*LValueLoc);
+ if (!Field->getType()->isReferenceType())
+ if (Optional<Loc> LValueLoc = LValue.getAs<Loc>())
+ InitVal = State->getSVal(*LValueLoc);
// If we fail to get the value for some reason, use a symbolic value.
if (InitVal.isUnknownOrUndef()) {
OpenPOWER on IntegriCloud