]> granicus.if.org Git - clang/commitdiff
Teach the static analyzer to not treat XPC types as CF types.
authorTed Kremenek <kremenek@apple.com>
Wed, 4 Jan 2012 00:35:48 +0000 (00:35 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 4 Jan 2012 00:35:48 +0000 (00:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147506 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CocoaConventions.cpp
test/Analysis/retain-release.m

index 9dc5ef4906bcfe56133377074960b44eb6fdbe49..0c1531da148cd33538f3f9f2a1aaca0435af9a7b 100644 (file)
@@ -68,7 +68,9 @@ bool cocoa::isRefType(QualType RetTy, StringRef Prefix,
     StringRef TDName = TD->getDecl()->getIdentifier()->getName();
     if (TDName.startswith(Prefix) && TDName.endswith("Ref"))
       return true;
-    
+    // XPC unfortunately uses CF-style function names, but aren't CF types.
+    if (TDName.startswith("xpc_"))
+      return false;
     RetTy = TD->getDecl()->getUnderlyingType();
   }
   
index 6f8bf09ebd74e6477e1ab12746f26304abdfd5cc..a6c24cee00b26c7140a8d0e4df6841c9f1e0f63e 100644 (file)
@@ -42,6 +42,7 @@ typedef unsigned int uint32_t;
 typedef unsigned long long uint64_t;
 typedef unsigned int UInt32;
 typedef signed long CFIndex;
+typedef CFIndex CFByteOrder;
 typedef struct {
     CFIndex location;
     CFIndex length;
@@ -1604,3 +1605,18 @@ void rdar10232019_positive() {
   NSLog(@"%@", otherString);
 }
 
+// RetainCountChecker support for XPC.
+// <rdar://problem/9658496>
+typedef void * xpc_object_t;
+xpc_object_t _CFXPCCreateXPCObjectFromCFObject(CFTypeRef cf);
+void xpc_release(xpc_object_t object);
+
+void rdar9658496() {
+  CFStringRef cf;
+  xpc_object_t xpc;
+  cf = CFStringCreateWithCString( ((CFAllocatorRef)0), "test", kCFStringEncodingUTF8 ); // no-warning
+  xpc = _CFXPCCreateXPCObjectFromCFObject( cf );
+  CFRelease(cf);
+  xpc_release(xpc);
+}
+