Author: george.karpenkov Date: Thu Jan 31 18:13:02 2019 New Revision: 352824
URL: http://llvm.org/viewvc/llvm-project?rev=352824&view=rev Log: [analyzer] [RetainCountChecker] Fix object type for CF/Obj-C bridged casts Having an incorrect type for a cast causes the checker to incorrectly dismiss the operation under ARC, leading to a false positive use-after-release on the test. rdar://47709885 Differential Revision: https://reviews.llvm.org/D57557 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp cfe/trunk/test/Analysis/objc-arc.m Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp?rev=352824&r1=352823&r2=352824&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp Thu Jan 31 18:13:02 2019 @@ -185,7 +185,16 @@ void RetainCountChecker::checkPostStmt(c if (!BE) return; - ArgEffect AE = ArgEffect(IncRef, ObjKind::ObjC); + QualType QT = CE->getType(); + ObjKind K; + if (coreFoundation::isCFObjectRef(QT)) { + K = ObjKind::CF; + } else { + assert(cocoa::isCocoaObjectRef(QT)); + K = ObjKind::ObjC; + } + + ArgEffect AE = ArgEffect(IncRef, K); switch (BE->getBridgeKind()) { case OBC_Bridge: Modified: cfe/trunk/test/Analysis/objc-arc.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/objc-arc.m?rev=352824&r1=352823&r2=352824&view=diff ============================================================================== --- cfe/trunk/test/Analysis/objc-arc.m (original) +++ cfe/trunk/test/Analysis/objc-arc.m Thu Jan 31 18:13:02 2019 @@ -123,7 +123,7 @@ void rdar9424882() { typedef const void *CFTypeRef; typedef const struct __CFString *CFStringRef; -@interface NSString +@interface NSString : NSObject - (id) self; @end @@ -231,3 +231,16 @@ id rdar14061675() { return result; } +typedef const void * CFTypeRef; +typedef const struct __CFString * CFStringRef; +typedef const struct __CFAllocator * CFAllocatorRef; +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 +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits