From: Anna Zaks Date: Wed, 20 Jun 2012 23:35:57 +0000 (+0000) Subject: [analyzer] Malloc leak false positive: Allow xpc context to escape. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=52a04812e5767dab68efb33ad044760b5b168941;p=clang [analyzer] Malloc leak false positive: Allow xpc context to escape. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158875 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 48fdec2d3f..3171c03eb0 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -1298,6 +1298,12 @@ bool MallocChecker::doesNotFreeMemory(const CallOrObjCMessage *Call, if (FName.equals("pthread_setspecific")) return false; + // White list xpc connection context. + // TODO: Ensure that the deallocation actually happens, need to reason + // about "xpc_connection_set_finalizer_f". + if (FName.equals("xpc_connection_set_context")) + return false; + // White list the 'XXXNoCopy' ObjC functions. if (FName.endswith("NoCopy")) { // Look for the deallocator argument. We know that the memory ownership diff --git a/test/Analysis/malloc.c b/test/Analysis/malloc.c index c532d6813f..9596751a0d 100644 --- a/test/Analysis/malloc.c +++ b/test/Analysis/malloc.c @@ -974,3 +974,16 @@ void testCGContextLeak() // object doesn't escape and it hasn't been freed in this function. } +// Allow xpc context to escape. radar://11635258 +// TODO: Would be great if we checked that the finalize_connection_context actually releases it. +static void finalize_connection_context(void *ctx) { + int *context = ctx; + free(context); +} +void foo (xpc_connection_t peer) { + int *ctx = calloc(1, sizeof(int)); + xpc_connection_set_context(peer, ctx); + xpc_connection_set_finalizer_f(peer, finalize_connection_context); + xpc_connection_resume(peer); +} + diff --git a/test/Analysis/system-header-simulator.h b/test/Analysis/system-header-simulator.h index d2fb2e8684..5790fb9cff 100644 --- a/test/Analysis/system-header-simulator.h +++ b/test/Analysis/system-header-simulator.h @@ -53,3 +53,10 @@ CGContextRef CGBitmapContextCreate(void *data/*, size_t width, size_t height, CGColorSpaceRef space, CGBitmapInfo bitmapInfo*/); void *CGBitmapContextGetData(CGContextRef context); + +// Include xpc. +typedef struct _xpc_connection_s * xpc_connection_t; +typedef void (*xpc_finalizer_t)(void *value); +void xpc_connection_set_context(xpc_connection_t connection, void *context); +void xpc_connection_set_finalizer_f(xpc_connection_t connection, xpc_finalizer_t finalizer); +void xpc_connection_resume(xpc_connection_t connection);