summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-03-09 23:34:08 +0000
committerTed Kremenek <kremenek@apple.com>2012-03-09 23:34:08 +0000
commit33be12003f67d7c7cd005de11652bf53aa43d390 (patch)
treec9a00e894501fb4486724dc213693888a26efea1 /clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
parent3e914578c574163245736f7b644908ccfe7084fd (diff)
downloadbcm5719-llvm-33be12003f67d7c7cd005de11652bf53aa43d390.tar.gz
bcm5719-llvm-33be12003f67d7c7cd005de11652bf53aa43d390.zip
Teach RetainCountChecker about mixing method families with explicit annotations. Fixes <rdar://problem/10824732>.
llvm-svn: 152448
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
index a59d1e4e4ca..a5146b7cb2f 100644
--- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
@@ -1192,6 +1192,36 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
return;
RetainSummaryTemplate Template(Summ, DefaultSummary, *this);
+
+ // Check the method family, and apply any default annotations.
+ switch (MD->getMethodFamily()) {
+ case OMF_None:
+ break;
+ case OMF_init:
+ Template->setRetEffect(ObjCInitRetE);
+ Template->setReceiverEffect(DecRefMsg);
+ break;
+ case OMF_alloc:
+ case OMF_new:
+ case OMF_copy:
+ case OMF_mutableCopy:
+ Template->setRetEffect(ObjCAllocRetE);
+ break;
+ case OMF_autorelease:
+ Template->setReceiverEffect(Autorelease);
+ case OMF_retain:
+ Template->setReceiverEffect(IncRefMsg);
+ break;
+ case OMF_release:
+ Template->setReceiverEffect(DecRefMsg);
+ break;
+ case OMF_self:
+ case OMF_performSelector:
+ case OMF_retainCount:
+ case OMF_dealloc:
+ case OMF_finalize:
+ break;
+ }
bool isTrackedLoc = false;
OpenPOWER on IntegriCloud