diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-02-18 00:06:12 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-02-18 00:06:12 +0000 |
commit | 1fcc56c57a00017766392fc3f591799ed8479699 (patch) | |
tree | 6f2692002f2ff7fbd08830d313f04a18af1187d1 /clang/lib/Checker/CFRefCount.cpp | |
parent | f2b64ba858295403098adf456e5869e0e354986d (diff) | |
download | bcm5719-llvm-1fcc56c57a00017766392fc3f591799ed8479699.tar.gz bcm5719-llvm-1fcc56c57a00017766392fc3f591799ed8479699.zip |
Recognize attributes ns_returns_not_retained and cf_returns_not_retained
in the static analyzer.
llvm-svn: 96539
Diffstat (limited to 'clang/lib/Checker/CFRefCount.cpp')
-rw-r--r-- | clang/lib/Checker/CFRefCount.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/clang/lib/Checker/CFRefCount.cpp b/clang/lib/Checker/CFRefCount.cpp index 2eb9607bc92..ecb98a0496f 100644 --- a/clang/lib/Checker/CFRefCount.cpp +++ b/clang/lib/Checker/CFRefCount.cpp @@ -1222,6 +1222,12 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, else if (FD->getAttr<CFReturnsRetainedAttr>()) { Summ.setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true)); } + else if (FD->getAttr<NSReturnsNotRetainedAttr>()) { + Summ.setRetEffect(RetEffect::MakeNotOwned(RetEffect::ObjC)); + } + else if (FD->getAttr<CFReturnsNotRetainedAttr>()) { + Summ.setRetEffect(RetEffect::MakeNotOwned(RetEffect::CF)); + } } else if (RetTy->getAs<PointerType>()) { if (FD->getAttr<CFReturnsRetainedAttr>()) { @@ -1244,6 +1250,10 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, Summ.setRetEffect(ObjCAllocRetE); return; } + if (MD->getAttr<NSReturnsNotRetainedAttr>()) { + Summ.setRetEffect(RetEffect::MakeNotOwned(RetEffect::ObjC)); + return; + } isTrackedLoc = true; } @@ -1251,8 +1261,12 @@ RetainSummaryManager::updateSummaryFromAnnotations(RetainSummary &Summ, if (!isTrackedLoc) isTrackedLoc = MD->getResultType()->getAs<PointerType>() != NULL; - if (isTrackedLoc && MD->getAttr<CFReturnsRetainedAttr>()) - Summ.setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true)); + if (isTrackedLoc) { + if (MD->getAttr<CFReturnsRetainedAttr>()) + Summ.setRetEffect(RetEffect::MakeOwned(RetEffect::CF, true)); + else if (MD->getAttr<CFReturnsNotRetainedAttr>()) + Summ.setRetEffect(RetEffect::MakeNotOwned(RetEffect::CF)); + } } RetainSummary* |