summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-12-05 18:34:54 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-12-05 18:34:54 +0000
commita717bc78b7723cfff52fdb3d9e928cf2c69a87b5 (patch)
treefbe5fc043e3128d7e06a1ca5cde4cc48e47be5c1 /clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp
parent5d42bc7ce82bc7daef12b53ca77452f919bd3277 (diff)
downloadbcm5719-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.cpp69
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();
OpenPOWER on IntegriCloud