diff options
author | Devin Coughlin <dcoughlin@apple.com> | 2016-04-08 19:59:16 +0000 |
---|---|---|
committer | Devin Coughlin <dcoughlin@apple.com> | 2016-04-08 19:59:16 +0000 |
commit | ebaa56bb263b56ee47d3492d7e32fe1db639b155 (patch) | |
tree | c50ac14344c5bb258b41c689d30ede262390ebf3 /clang/lib | |
parent | fe1bc708b53016d0800b54342b268c09b8c52a6f (diff) | |
download | bcm5719-llvm-ebaa56bb263b56ee47d3492d7e32fe1db639b155.tar.gz bcm5719-llvm-ebaa56bb263b56ee47d3492d7e32fe1db639b155.zip |
[analyzer] Teach trackNullOrUndefValue about calls to property accessors.
Teach trackNullOrUndefValue() how to look through PseudoObjectExprs to find
the underlying method call for property getters. This makes over-suppression
of 'return nil' in getters consistent with the similar over-suppression for
method and function calls.
rdar://problem/24437252
llvm-svn: 265839
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 859a2220e09..e0f014714f7 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -908,6 +908,12 @@ static const Expr *peelOffOuterExpr(const Expr *Ex, return peelOffOuterExpr(EWC->getSubExpr(), N); if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(Ex)) return peelOffOuterExpr(OVE->getSourceExpr(), N); + if (auto *POE = dyn_cast<PseudoObjectExpr>(Ex)) { + auto *PropRef = dyn_cast<ObjCPropertyRefExpr>(POE->getSyntacticForm()); + if (PropRef && PropRef->isMessagingGetter()) { + return peelOffOuterExpr(POE->getSemanticExpr(1), N); + } + } // Peel off the ternary operator. if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(Ex)) { |