diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2019-01-29 19:29:59 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2019-01-29 19:29:59 +0000 |
commit | d37ff4e888729c807fc4b9e8d2cac0846c5dcf73 (patch) | |
tree | e3dcac2b9b1f7f0f971474fa94ae95fb9685b424 /clang/lib/Analysis/RetainSummaryManager.cpp | |
parent | b0fc58b57c577841ede11f534768f5acf675175c (diff) | |
download | bcm5719-llvm-d37ff4e888729c807fc4b9e8d2cac0846c5dcf73.tar.gz bcm5719-llvm-d37ff4e888729c807fc4b9e8d2cac0846c5dcf73.zip |
[analyzer] [RetainCountChecker] Track input parameters to the top-level function
Track them for ISL/OS objects by default, and for NS/CF under a flag.
rdar://47536377
Differential Revision: https://reviews.llvm.org/D57356
llvm-svn: 352534
Diffstat (limited to 'clang/lib/Analysis/RetainSummaryManager.cpp')
-rw-r--r-- | clang/lib/Analysis/RetainSummaryManager.cpp | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/clang/lib/Analysis/RetainSummaryManager.cpp b/clang/lib/Analysis/RetainSummaryManager.cpp index 9a514efb7c3..c3611711974 100644 --- a/clang/lib/Analysis/RetainSummaryManager.cpp +++ b/clang/lib/Analysis/RetainSummaryManager.cpp @@ -145,7 +145,7 @@ static bool isSubclass(const Decl *D, } static bool isOSObjectSubclass(const Decl *D) { - return isSubclass(D, "OSMetaClassBase"); + return D && isSubclass(D, "OSMetaClassBase"); } static bool isOSObjectDynamicCast(StringRef S) { @@ -156,6 +156,15 @@ static bool isOSObjectThisCast(StringRef S) { return S == "metaCast"; } + +static bool isOSObjectPtr(QualType QT) { + return isOSObjectSubclass(QT->getPointeeCXXRecordDecl()); +} + +static bool isISLObjectRef(QualType Ty) { + return StringRef(Ty.getAsString()).startswith("isl_"); +} + static bool isOSIteratorSubclass(const Decl *D) { return isSubclass(D, "OSIterator"); } @@ -600,6 +609,38 @@ void RetainSummaryManager::updateSummaryForReceiverUnconsumedSelf( Template->setRetEffect(RetEffect::MakeNoRet()); } + +void RetainSummaryManager::updateSummaryForArgumentTypes( + const AnyCall &C, const RetainSummary *&RS) { + RetainSummaryTemplate Template(RS, *this); + + unsigned parm_idx = 0; + for (auto pi = C.param_begin(), pe = C.param_end(); pi != pe; + ++pi, ++parm_idx) { + QualType QT = (*pi)->getType(); + + // Skip already created values. + if (RS->getArgEffects().contains(parm_idx)) + continue; + + ObjKind K = ObjKind::AnyObj; + + if (isISLObjectRef(QT)) { + K = ObjKind::Generalized; + } else if (isOSObjectPtr(QT)) { + K = ObjKind::OS; + } else if (cocoa::isCocoaObjectRef(QT)) { + K = ObjKind::ObjC; + } else if (coreFoundation::isCFObjectRef(QT)) { + K = ObjKind::CF; + } + + if (K != ObjKind::AnyObj) + Template->addArg(AF, parm_idx, + ArgEffect(RS->getDefaultArgEffect().getKind(), K)); + } +} + const RetainSummary * RetainSummaryManager::getSummary(AnyCall C, bool HasNonZeroCallbackArg, @@ -636,6 +677,8 @@ RetainSummaryManager::getSummary(AnyCall C, if (IsReceiverUnconsumedSelf) updateSummaryForReceiverUnconsumedSelf(Summ); + updateSummaryForArgumentTypes(C, Summ); + assert(Summ && "Unknown call type?"); return Summ; } |