summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-11-30 02:18:50 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-11-30 02:18:50 +0000
commitb43772d85cffeb786a87ff1718dcd379d8cf02dc (patch)
tree6d2161de17fac9202956eff85f5e5e38774359ab /clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
parent1657f36c7f48a008ef435949b6457034894745e0 (diff)
downloadbcm5719-llvm-b43772d85cffeb786a87ff1718dcd379d8cf02dc.tar.gz
bcm5719-llvm-b43772d85cffeb786a87ff1718dcd379d8cf02dc.zip
[analyzer] Switch retain count checker for OSObject to use OS_* attributes
Instead of generalized reference counting annotations. Differential Revision: https://reviews.llvm.org/D55041 llvm-svn: 347948
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
index cbaee85beb7..fc4544f843d 100644
--- a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
+++ b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
@@ -664,15 +664,21 @@ RetainSummaryManager::getRetEffectFromAnnotations(QualType RetTy,
return None;
}
- if (D->hasAttr<CFReturnsRetainedAttr>())
+ if (D->hasAttr<CFReturnsRetainedAttr>()) {
return RetEffect::MakeOwned(RetEffect::CF);
- else if (hasRCAnnotation(D, "rc_ownership_returns_retained"))
+ } else if (D->hasAttr<OSReturnsRetainedAttr>()) {
+ return RetEffect::MakeOwned(RetEffect::OS);
+ } else if (hasRCAnnotation(D, "rc_ownership_returns_retained")) {
return RetEffect::MakeOwned(RetEffect::Generalized);
+ }
- if (D->hasAttr<CFReturnsNotRetainedAttr>())
+ if (D->hasAttr<CFReturnsNotRetainedAttr>()) {
return RetEffect::MakeNotOwned(RetEffect::CF);
- else if (hasRCAnnotation(D, "rc_ownership_returns_not_retained"))
+ } else if (D->hasAttr<OSReturnsNotRetainedAttr>()) {
+ return RetEffect::MakeNotOwned(RetEffect::OS);
+ } else if (hasRCAnnotation(D, "rc_ownership_returns_not_retained")) {
return RetEffect::MakeNotOwned(RetEffect::Generalized);
+ }
return None;
}
@@ -688,15 +694,16 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
// Effects on the parameters.
unsigned parm_idx = 0;
- for (FunctionDecl::param_const_iterator pi = FD->param_begin(),
+ for (auto pi = FD->param_begin(),
pe = FD->param_end(); pi != pe; ++pi, ++parm_idx) {
const ParmVarDecl *pd = *pi;
- if (pd->hasAttr<NSConsumedAttr>())
+ if (pd->hasAttr<NSConsumedAttr>()) {
Template->addArg(AF, parm_idx, DecRefMsg);
- else if (pd->hasAttr<CFConsumedAttr>() ||
- hasRCAnnotation(pd, "rc_ownership_consumed"))
+ } else if (pd->hasAttr<CFConsumedAttr>() ||
+ pd->hasAttr<OSConsumedAttr>() ||
+ hasRCAnnotation(pd, "rc_ownership_consumed")) {
Template->addArg(AF, parm_idx, DecRef);
- else if (pd->hasAttr<CFReturnsRetainedAttr>() ||
+ } else if (pd->hasAttr<CFReturnsRetainedAttr>() ||
hasRCAnnotation(pd, "rc_ownership_returns_retained")) {
QualType PointeeTy = pd->getType()->getPointeeType();
if (!PointeeTy.isNull())
@@ -734,9 +741,9 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ,
pi=MD->param_begin(), pe=MD->param_end();
pi != pe; ++pi, ++parm_idx) {
const ParmVarDecl *pd = *pi;
- if (pd->hasAttr<NSConsumedAttr>())
+ if (pd->hasAttr<NSConsumedAttr>()) {
Template->addArg(AF, parm_idx, DecRefMsg);
- else if (pd->hasAttr<CFConsumedAttr>()) {
+ } else if (pd->hasAttr<CFConsumedAttr>() || pd->hasAttr<OSConsumedAttr>()) {
Template->addArg(AF, parm_idx, DecRef);
} else if (pd->hasAttr<CFReturnsRetainedAttr>()) {
QualType PointeeTy = pd->getType()->getPointeeType();
OpenPOWER on IntegriCloud