From a92206ea578983f86fbf1246702955a10056dff8 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 5 Feb 2009 22:34:53 +0000 Subject: [PATCH] Add 'AppendValue' to the list of magic CF function names that cause a tracked object to escape. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63891 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CFRefCount.cpp | 3 ++- test/Analysis/rdar-6539791.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 8ed6bb285c..ee17a57e9f 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -826,7 +826,8 @@ RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD) { // ArgEffect E = (CStrInCStrNoCase(FName, "InsertValue") || CStrInCStrNoCase(FName, "AddValue") || - CStrInCStrNoCase(FName, "SetValue")) + CStrInCStrNoCase(FName, "SetValue") || + CStrInCStrNoCase(FName, "AppendValue")) ? MayEscape : DoNothing; S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, E); diff --git a/test/Analysis/rdar-6539791.c b/test/Analysis/rdar-6539791.c index 0d0b675d94..75485b0b54 100644 --- a/test/Analysis/rdar-6539791.c +++ b/test/Analysis/rdar-6539791.c @@ -15,7 +15,11 @@ enum { kCFNumberSInt32Type = 3 }; CFMutableDictionaryRef CFDictionaryCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks); void CFDictionaryAddValue(CFMutableDictionaryRef theDict, const void *key, const void *value); void CFRelease(CFTypeRef cf); +CFTypeRef CFRetain(CFTypeRef cf); extern CFNumberRef CFNumberCreate(CFAllocatorRef allocator, CFNumberType theType, const void *valuePtr); +typedef const struct __CFArray * CFArrayRef; +typedef struct __CFArray * CFMutableArrayRef; +void CFArrayAppendValue(CFMutableArrayRef theArray, const void *value); void f(CFMutableDictionaryRef y, void* key, void* val_key) { CFMutableDictionaryRef x = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); @@ -29,3 +33,15 @@ void f(CFMutableDictionaryRef y, void* key, void* val_key) { CFDictionaryAddValue(y, val_key, value); // no-warning } } + +// +// Same issue, except with "AppendValue" functions. +void f2(CFMutableArrayRef x) { + signed z = 1; + CFNumberRef value = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &z); + // CFArrayAppendValue keeps a reference to value. + CFArrayAppendValue(x, value); + CFRelease(value); + CFRetain(value); + CFRelease(value); // no-warning +} -- 2.40.0