Author: dcoughlin Date: Wed Jun 22 12:03:10 2016 New Revision: 273441 URL: http://llvm.org/viewvc/llvm-project?rev=273441&view=rev Log: [analyzer] Teach ObjCDeallocChecker about XCTestCase
Like with SenTestCase, subclasses of XCTestCase follow a "tear down" idiom to release instance variables and so typically do not release ivars in -dealloc. This commit applies the existing special casing for SenTestCase to XCTestCase as well. rdar://problem/25884696 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp cfe/trunk/test/Analysis/DeallocMissingRelease.m Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp?rev=273441&r1=273440&r2=273441&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp Wed Jun 22 12:03:10 2016 @@ -98,8 +98,9 @@ class ObjCDeallocChecker check::PointerEscape, check::PreStmt<ReturnStmt>> { - mutable IdentifierInfo *NSObjectII, *SenTestCaseII, *Block_releaseII, - *CIFilterII; + mutable IdentifierInfo *NSObjectII, *SenTestCaseII, *XCTestCaseII, + *Block_releaseII, *CIFilterII; + mutable Selector DeallocSel, ReleaseSel; std::unique_ptr<BugType> MissingReleaseBugType; @@ -760,9 +761,9 @@ bool ObjCDeallocChecker::diagnoseMistake return true; } -ObjCDeallocChecker:: - ObjCDeallocChecker() - : NSObjectII(nullptr), SenTestCaseII(nullptr), CIFilterII(nullptr) { +ObjCDeallocChecker::ObjCDeallocChecker() + : NSObjectII(nullptr), SenTestCaseII(nullptr), XCTestCaseII(nullptr), + CIFilterII(nullptr) { MissingReleaseBugType.reset( new BugType(this, "Missing ivar release (leak)", @@ -784,6 +785,7 @@ void ObjCDeallocChecker::initIdentifierI NSObjectII = &Ctx.Idents.get("NSObject"); SenTestCaseII = &Ctx.Idents.get("SenTestCase"); + XCTestCaseII = &Ctx.Idents.get("XCTestCase"); Block_releaseII = &Ctx.Idents.get("_Block_release"); CIFilterII = &Ctx.Idents.get("CIFilter"); @@ -1023,11 +1025,11 @@ bool ObjCDeallocChecker::classHasSeparat if (II == NSObjectII) return false; - // FIXME: For now, ignore classes that subclass SenTestCase, as these don't - // need to implement -dealloc. They implement tear down in another way, - // which we should try and catch later. + // FIXME: For now, ignore classes that subclass SenTestCase and XCTestCase, + // as these don't need to implement -dealloc. They implement tear down in + // another way, which we should try and catch later. // http://llvm.org/bugs/show_bug.cgi?id=3187 - if (II == SenTestCaseII) + if (II == XCTestCaseII || II == SenTestCaseII) return true; } Modified: cfe/trunk/test/Analysis/DeallocMissingRelease.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/DeallocMissingRelease.m?rev=273441&r1=273440&r2=273441&view=diff ============================================================================== --- cfe/trunk/test/Analysis/DeallocMissingRelease.m (original) +++ cfe/trunk/test/Analysis/DeallocMissingRelease.m Wed Jun 22 12:03:10 2016 @@ -723,6 +723,28 @@ struct SomeStruct { } @end +@interface XCTestCase : NSObject {} +@end + +@interface MyClassXCTest : XCTestCase +@property (retain) NSObject *ivar; +@end + +@implementation MyClassXCTest +-(void)tearDown { +#if NON_ARC + [_ivar release]; +#endif +} + +-(void)dealloc; { +#if NON_ARC + [super dealloc]; // no-warning +#endif +} +@end + + __attribute__((objc_root_class)) @interface NonNSObjectMissingDealloc @property (retain) NSObject *ivar; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits