[analyzer] Hotfix for RetainCountChecker: assert was too strong.
authorGeorge Karpenkov <ekarpenkov@apple.com>
Fri, 1 Feb 2019 23:06:44 +0000 (23:06 +0000)
committerGeorge Karpenkov <ekarpenkov@apple.com>
Fri, 1 Feb 2019 23:06:44 +0000 (23:06 +0000)
Bridged casts can happen to non-CF objects as well.

llvm-svn: 352938

clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp
clang/test/Analysis/objc-arc.m

index 9d2d8cd..cdda327 100644 (file)
@@ -187,11 +187,10 @@ void RetainCountChecker::checkPostStmt(const CastExpr *CE,
 
   QualType QT = CE->getType();
   ObjKind K;
-  if (coreFoundation::isCFObjectRef(QT)) {
-    K = ObjKind::CF;
-  } else {
-    assert(cocoa::isCocoaObjectRef(QT));
+  if (QT->isObjCObjectPointerType()) {
     K = ObjKind::ObjC;
+  } else {
+    K = ObjKind::CF;
   }
 
   ArgEffect AE = ArgEffect(IncRef, K);
index c5549fa..30e4ffc 100644 (file)
@@ -239,8 +239,23 @@ extern const CFAllocatorRef kCFAllocatorDefault;
 extern CFTypeRef CFRetain(CFTypeRef cf);
 extern void CFRelease(CFTypeRef cf);
 
+
 void check_bridge_retained_cast() {
     NSString *nsStr = [[NSString alloc] init];
     CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr;
     CFRelease(cfStr); // no-warning
 }
+
+@interface A;
+@end
+
+void check_bridge_to_non_cocoa(CFStringRef s) {
+  A *a = (__bridge_transfer A *) s; // no-crash
+}
+
+struct B;
+
+struct B * check_bridge_to_non_cf() {
+  NSString *s = [[NSString alloc] init];
+  return (__bridge struct B*) s;
+}