From 0ca23d3f730ad116ff0d151ec414f9a4caebea20 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 . llvm-svn: 63891 --- clang/lib/Analysis/CFRefCount.cpp | 3 ++- clang/test/Analysis/rdar-6539791.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index 8ed6bb285c0d..ee17a57e9fb4 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/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/clang/test/Analysis/rdar-6539791.c b/clang/test/Analysis/rdar-6539791.c index 0d0b675d945b..75485b0b547c 100644 --- a/clang/test/Analysis/rdar-6539791.c +++ b/clang/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 +}