From b642fc5db4e8d049828704e3ec03562579451f59 Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Tue, 16 Oct 2012 19:36:37 +0000 Subject: [PATCH] [analyzer] Ivar Invalidation: track ivars in continuations and @implementation. llvm-svn: 166047 --- clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp | 10 +++++----- clang/test/Analysis/objc_invalidation.m | 11 ++++++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp index 462066a..e52e3d4 100644 --- a/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp @@ -314,12 +314,12 @@ void IvarInvalidationChecker::checkASTDecl(const ObjCMethodDecl *D, // Collect all ivars that need cleanup. IvarSet Ivars; const ObjCInterfaceDecl *InterfaceD = D->getClassInterface(); - for (ObjCInterfaceDecl::ivar_iterator - II = InterfaceD->ivar_begin(), - IE = InterfaceD->ivar_end(); II != IE; ++II) { - const ObjCIvarDecl *Iv = *II; + + // Collect ivars declared in this class, its extensions and its implementation + ObjCInterfaceDecl *IDecl = const_cast(InterfaceD); + for (const ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; + Iv= Iv->getNextIvar()) trackIvar(Iv, Ivars); - } // Construct Property/Property Accessor to Ivar maps to assist checking if an // ivar which is backing a property has been reset. diff --git a/clang/test/Analysis/objc_invalidation.m b/clang/test/Analysis/objc_invalidation.m index adcbbd6..17b74e9 100644 --- a/clang/test/Analysis/objc_invalidation.m +++ b/clang/test/Analysis/objc_invalidation.m @@ -93,7 +93,14 @@ extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, @end -@implementation SomeSubclassInvalidatableObject +@interface SomeSubclassInvalidatableObject() +@property (assign) SomeInvalidationImplementingObject* Prop8; +@end + +@implementation SomeSubclassInvalidatableObject{ + @private + SomeInvalidationImplementingObject *Ivar5; +} @synthesize Prop7 = _propIvar; @synthesize Prop3 = _Prop3; @@ -139,4 +146,6 @@ extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, // expected-warning@-4 {{Property SynthIvarProp needs to be invalidated}} // expected-warning@-5 {{Instance variable _Ivar3 needs to be invalidated}} // expected-warning@-6 {{Instance variable _Ivar4 needs to be invalidated}} + // expected-warning@-7 {{Instance variable Ivar5 needs to be invalidated or set to nil}} + // expected-warning@-8 {{Property Prop8 needs to be invalidated}} @end -- 2.7.4