]> granicus.if.org Git - clang/commitdiff
Add analyzer support for objc_atomicCompareAndSwap()
authorTed Kremenek <kremenek@apple.com>
Sat, 11 Apr 2009 00:54:13 +0000 (00:54 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 11 Apr 2009 00:54:13 +0000 (00:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68849 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/GRExprEngine.cpp
test/Analysis/NSString.m

index 9f049d5b3318763c78b3d70003e20b5cd60a44c1..43d7331dd9ae6018982b215064524ac2260eee07 100644 (file)
@@ -1377,9 +1377,10 @@ static bool EvalOSAtomic(ExplodedNodeSet<GRState>& 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;
 }
index b1e524f6c5d923471c651802ff3289ac72c34b95..9de6853cdf89940ee36e9362d36de2ddab0f25df 100644 (file)
@@ -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];
+}
+