diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2018-12-21 00:18:58 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2018-12-21 00:18:58 +0000 |
commit | 212bbfad25e3e13f309e438f4cc7b51ecb9a9643 (patch) | |
tree | 444831c71ba4781b0a1e747eac916f2d9667facf /clang/lib | |
parent | 33c46ca675c8b6728240af5630ab9f39bf9e8bdc (diff) | |
download | llvm-212bbfad25e3e13f309e438f4cc7b51ecb9a9643.zip llvm-212bbfad25e3e13f309e438f4cc7b51ecb9a9643.tar.gz llvm-212bbfad25e3e13f309e438f4cc7b51ecb9a9643.tar.bz2 |
[analyzer] RetainCount: Suppress retain detection heuristic on some CM methods.
If it ends with "Retain" like CFRetain and returns a CFTypeRef like CFRetain,
then it is not necessarily a CFRetain. But it is indeed true that these two
return something retained.
Differential Revision: https://reviews.llvm.org/D55907
rdar://problem/39390714
llvm-svn: 349862
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp index 3bbb4c7..0187eba 100644 --- a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp @@ -204,6 +204,11 @@ const RetainSummary *RetainSummaryManager::getSummaryForObjCOrCFObject( AllowAnnotations = false; return RetTy->isObjCIdType() ? getUnarySummary(FT, cfmakecollectable) : getPersistentStopSummary(); + } else if (FName == "CMBufferQueueDequeueAndRetain" || + FName == "CMBufferQueueDequeueIfDataReadyAndRetain") { + // Part of: <rdar://problem/39390714>. + return getPersistentSummary(RetEffect::MakeOwned(RetEffect::CF), DoNothing, + DoNothing); } else if (FName == "CFPlugInInstanceCreate") { return getPersistentSummary(RetEffect::MakeNoRet()); } else if (FName == "IORegistryEntrySearchCFProperty" || @@ -591,6 +596,12 @@ RetainSummaryManager::canEval(const CallExpr *CE, const FunctionDecl *FD, // Handle: (CF|CG|CV)Retain // CFAutorelease // It's okay to be a little sloppy here. + if (FName == "CMBufferQueueDequeueAndRetain" || + FName == "CMBufferQueueDequeueIfDataReadyAndRetain") { + // Part of: <rdar://problem/39390714>. + // These are not retain. They just return something and retain it. + return None; + } if (cocoa::isRefType(ResultTy, "CF", FName) || cocoa::isRefType(ResultTy, "CG", FName) || cocoa::isRefType(ResultTy, "CV", FName)) |