From: Anna Zaks Date: Mon, 26 Mar 2012 18:18:39 +0000 (+0000) Subject: [analyzer] Malloc: Allow a pointer to escape through OSAtomicEnqueue. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4cd7edfa851ff5d9b37d09539a77685a12e82994;p=clang [analyzer] Malloc: Allow a pointer to escape through OSAtomicEnqueue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153453 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 5eca9178ad..7b9adb7c15 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -1257,7 +1257,8 @@ bool MallocChecker::doesNotFreeMemory(const CallOrObjCMessage *Call, // this would be to implement a pointer escapes callback. if (FName == "CVPixelBufferCreateWithBytes" || FName == "CGBitmapContextCreateWithData" || - FName == "CVPixelBufferCreateWithPlanarBytes") { + FName == "CVPixelBufferCreateWithPlanarBytes" || + FName == "OSAtomicEnqueue") { return false; } diff --git a/test/Analysis/malloc.mm b/test/Analysis/malloc.mm index 4cb2cfa328..fe14edeedd 100644 --- a/test/Analysis/malloc.mm +++ b/test/Analysis/malloc.mm @@ -106,3 +106,14 @@ void testBlocks() { myBlock(3); } +// Test that we handle pointer escaping through OSAtomicEnqueue. +typedef volatile struct { + void *opaque1; + long opaque2; +} OSQueueHead; +void OSAtomicEnqueue( OSQueueHead *__list, void *__new, size_t __offset) __attribute__((weak_import)); +static inline void radar11111210(OSQueueHead *pool) { + void *newItem = malloc(4); + OSAtomicEnqueue(pool, newItem, 4); +} +