From: Ted Kremenek Date: Wed, 22 Oct 2008 20:54:52 +0000 (+0000) Subject: Enhance reference-count checker to correctly identify CG "release" functions. This... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=64e859a36634dfc848634d22aa428a48f82487d3;p=clang Enhance reference-count checker to correctly identify CG "release" functions. This fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57997 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index acf4b568ed..db8a4598ba 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -704,8 +704,12 @@ RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD) { } } - if (FName[0] == 'C' && FName[1] == 'F') - S = getCFSummary(FD, FName); + if (FName[0] == 'C') { + if (FName[1] == 'F') + S = getCFSummary(FD, FName); + else if (FName[1] == 'G') + S = getCGSummary(FD, FName); + } else if (FName[0] == 'N' && FName[1] == 'S') S = getNSSummary(FD, FName); } @@ -834,10 +838,14 @@ RetainSummary* RetainSummaryManager::getCFSummaryCreateRule(FunctionDecl* FD) { FunctionType* FT = dyn_cast(FD->getType().getTypePtr()); - - if (FT && !isCFRefType(FT->getResultType())) - return getPersistentSummary(RetEffect::MakeNoRet()); + if (FT) { + QualType ResTy = FT->getResultType(); + + if (!isCFRefType(ResTy) && !isCGRefType(ResTy)) + return getPersistentSummary(RetEffect::MakeNoRet()); + } + assert (ScratchArgs.empty()); if (FD->getIdentifier() == CFDictionaryCreateII) { diff --git a/test/Analysis/CGColorSpace.c b/test/Analysis/CGColorSpace.c new file mode 100644 index 0000000000..793f75faeb --- /dev/null +++ b/test/Analysis/CGColorSpace.c @@ -0,0 +1,18 @@ +// clang -checker-cfref -verify %s + +typedef struct CGColorSpace *CGColorSpaceRef; +extern CGColorSpaceRef CGColorSpaceCreateDeviceRGB(void); +extern CGColorSpaceRef CGColorSpaceRetain(CGColorSpaceRef space); +extern void CGColorSpaceRelease(CGColorSpaceRef space); + +void f() { + CGColorSpaceRef X = CGColorSpaceCreateDeviceRGB(); + CGColorSpaceRetain(X); // expected-warning{{leak}} +} + +void fb() { + CGColorSpaceRef X = CGColorSpaceCreateDeviceRGB(); + CGColorSpaceRetain(X); + CGColorSpaceRelease(X); + CGColorSpaceRelease(X); // no-warning +}