From: Ted Kremenek Date: Sat, 11 Apr 2009 00:54:13 +0000 (+0000) Subject: Add analyzer support for objc_atomicCompareAndSwap() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3bf76fb2442093ad871f1adeda608e881b9dee6;p=clang Add analyzer support for objc_atomicCompareAndSwap() git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68849 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 9f049d5b33..43d7331dd9 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -1377,9 +1377,10 @@ static bool EvalOSAtomic(ExplodedNodeSet& Dst, const char *FName = FD->getNameAsCString(); // Check for compare and swap. - if (strncmp(FName, "OSAtomicCompareAndSwap", 22) == 0) + if (strncmp(FName, "OSAtomicCompareAndSwap", 22) == 0 || + strncmp(FName, "objc_atomicCompareAndSwap", 25) == 0) return EvalOSAtomicCompareAndSwap(Dst, Engine, Builder, CE, L, Pred); - + // FIXME: Other atomics. return false; } diff --git a/test/Analysis/NSString.m b/test/Analysis/NSString.m index b1e524f6c5..9de6853cdf 100644 --- a/test/Analysis/NSString.m +++ b/test/Analysis/NSString.m @@ -216,13 +216,23 @@ id testSharedClassFromFunction() { // Test OSCompareAndSwap _Bool OSAtomicCompareAndSwapPtr( void *__oldValue, void *__newValue, void * volatile *__theValue ); +extern BOOL objc_atomicCompareAndSwapPtr(id predicate, id replacement, volatile id *objectLocation); void testOSCompareAndSwap() { NSString *old = 0; - NSString *s = [[NSString alloc] init]; + NSString *s = [[NSString alloc] init]; // no-warning if (!OSAtomicCompareAndSwapPtr(0, s, (void**) &old)) [s release]; else [old release]; } +void test_objc_atomicCompareAndSwap() { + NSString *old = 0; + NSString *s = [[NSString alloc] init]; // no-warning + if (!objc_atomicCompareAndSwapPtr(0, s, &old)) + [s release]; + else + [old release]; +} +