From c008db99d701ca2ea534e71610e5452357051b0a Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 6 Sep 2012 23:47:02 +0000 Subject: [PATCH] Teach RetainCountChecker that CFPlugInInstanceCreate does not return a CF object at all. Fixes llvm-svn: 163362 --- .../StaticAnalyzer/Checkers/RetainCountChecker.cpp | 2 ++ clang/test/Analysis/retain-release.m | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index e95ba52f6970..5d10575d83dd 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -1074,6 +1074,8 @@ RetainSummaryManager::getFunctionSummary(const FunctionDecl *FD) { // The headers on OS X 10.8 use cf_consumed/ns_returns_retained, // but we can fully model NSMakeCollectable ourselves. AllowAnnotations = false; + } else if (FName == "CFPlugInInstanceCreate") { + S = getPersistentSummary(RetEffect::MakeNoRet()); } else if (FName == "IOBSDNameMatching" || FName == "IOServiceMatching" || FName == "IOServiceNameMatching" || diff --git a/clang/test/Analysis/retain-release.m b/clang/test/Analysis/retain-release.m index 9d2aa756b282..3a9649c74121 100644 --- a/clang/test/Analysis/retain-release.m +++ b/clang/test/Analysis/retain-release.m @@ -303,6 +303,10 @@ extern CGColorSpaceRef CGColorSpaceCreateDeviceRGB(void); // This is how NSMakeCollectable is declared in the OS X 10.8 headers. id NSMakeCollectable(CFTypeRef __attribute__((cf_consumed))) __attribute__((ns_returns_retained)); +typedef const struct __CFUUID * CFUUIDRef; + +extern +void *CFPlugInInstanceCreate(CFAllocatorRef allocator, CFUUIDRef factoryUUID, CFUUIDRef typeUUID); //===----------------------------------------------------------------------===// // Test cases. @@ -1907,3 +1911,11 @@ void test_custom_cf() { MyCFType x = CreateMyCFType(); // expected-warning {{leak of an object stored into 'x'}} } +//===----------------------------------------------------------------------===// +// Test calling CFPlugInInstanceCreate, which appears in CF but doesn't +// return a CF object. +//===----------------------------------------------------------------------===// + +void test_CFPlugInInstanceCreate(CFUUIDRef factoryUUID, CFUUIDRef typeUUID) { + CFPlugInInstanceCreate(kCFAllocatorDefault, factoryUUID, typeUUID); // no-warning +}