diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2018-12-05 18:34:54 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2018-12-05 18:34:54 +0000 |
commit | a717bc78b7723cfff52fdb3d9e928cf2c69a87b5 (patch) | |
tree | fbe5fc043e3128d7e06a1ca5cde4cc48e47be5c1 /clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp | |
parent | 5d42bc7ce82bc7daef12b53ca77452f919bd3277 (diff) | |
download | bcm5719-llvm-a717bc78b7723cfff52fdb3d9e928cf2c69a87b5.tar.gz bcm5719-llvm-a717bc78b7723cfff52fdb3d9e928cf2c69a87b5.zip |
[analyzer] Attribute for RetainCountChecker for OSObject should propagate with inheritance
rdar://46388388
Differential Revision: https://reviews.llvm.org/D55154
llvm-svn: 348396
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp index b42e0c1f64d..2bdfd2d0d06 100644 --- a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp @@ -686,9 +686,59 @@ RetainSummaryManager::getRetEffectFromAnnotations(QualType RetTy, return RetEffect::MakeNotOwned(RetEffect::Generalized); } + if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) + for (const auto *PD : MD->overridden_methods()) + if (auto RE = getRetEffectFromAnnotations(RetTy, PD)) + return RE; + return None; } +/// Apply the annotation of {@code pd} in function {@code FD} +/// to the resulting summary stored in out-parameter {@code Template}. +/// Return whether an annotation was applied. +bool applyFunctionParamAnnotationEffect(const ParmVarDecl *pd, + unsigned parm_idx, + const FunctionDecl *FD, + ArgEffects::Factory &AF, + RetainSummaryTemplate &Template) { + if (pd->hasAttr<NSConsumedAttr>()) { + Template->addArg(AF, parm_idx, DecRefMsg); + return true; + } else if (pd->hasAttr<CFConsumedAttr>() || pd->hasAttr<OSConsumedAttr>() || + hasRCAnnotation(pd, "rc_ownership_consumed")) { + Template->addArg(AF, parm_idx, DecRef); + return true; + } else if (pd->hasAttr<CFReturnsRetainedAttr>() || + hasRCAnnotation(pd, "rc_ownership_returns_retained")) { + QualType PointeeTy = pd->getType()->getPointeeType(); + if (!PointeeTy.isNull()) { + if (coreFoundation::isCFObjectRef(PointeeTy)) { + Template->addArg(AF, parm_idx, RetainedOutParameter); + return true; + } + } + } else if (pd->hasAttr<CFReturnsNotRetainedAttr>()) { + QualType PointeeTy = pd->getType()->getPointeeType(); + if (!PointeeTy.isNull()) { + if (coreFoundation::isCFObjectRef(PointeeTy)) { + Template->addArg(AF, parm_idx, UnretainedOutParameter); + return true; + } + } + } else { + if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) { + for (const auto *OD : MD->overridden_methods()) { + const ParmVarDecl *OP = OD->parameters()[parm_idx]; + if (applyFunctionParamAnnotationEffect(OP, parm_idx, MD, AF, Template)) + return true; + } + } + } + + return false; +} + void RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ, const FunctionDecl *FD) { @@ -703,24 +753,7 @@ RetainSummaryManager::updateSummaryFromAnnotations(const RetainSummary *&Summ, for (auto pi = FD->param_begin(), pe = FD->param_end(); pi != pe; ++pi, ++parm_idx) { const ParmVarDecl *pd = *pi; - if (pd->hasAttr<NSConsumedAttr>()) { - Template->addArg(AF, parm_idx, DecRefMsg); - } else if (pd->hasAttr<CFConsumedAttr>() || - pd->hasAttr<OSConsumedAttr>() || - hasRCAnnotation(pd, "rc_ownership_consumed")) { - Template->addArg(AF, parm_idx, DecRef); - } else if (pd->hasAttr<CFReturnsRetainedAttr>() || - hasRCAnnotation(pd, "rc_ownership_returns_retained")) { - QualType PointeeTy = pd->getType()->getPointeeType(); - if (!PointeeTy.isNull()) - if (coreFoundation::isCFObjectRef(PointeeTy)) - Template->addArg(AF, parm_idx, RetainedOutParameter); - } else if (pd->hasAttr<CFReturnsNotRetainedAttr>()) { - QualType PointeeTy = pd->getType()->getPointeeType(); - if (!PointeeTy.isNull()) - if (coreFoundation::isCFObjectRef(PointeeTy)) - Template->addArg(AF, parm_idx, UnretainedOutParameter); - } + applyFunctionParamAnnotationEffect(pd, parm_idx, FD, AF, Template); } QualType RetTy = FD->getReturnType(); |