diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-03-09 23:34:08 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-03-09 23:34:08 +0000 |
commit | 33be12003f67d7c7cd005de11652bf53aa43d390 (patch) | |
tree | c9a00e894501fb4486724dc213693888a26efea1 /clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | |
parent | 3e914578c574163245736f7b644908ccfe7084fd (diff) | |
download | bcm5719-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.cpp | 30 |
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; |