2010-12-17 6 views
2

Ich habe ein Skript, das ich im Terminal ausführe, das den Scan-Build-Code-Analyzer auf meinen iPhone-Anwendungen ausführt, um nach Problemen zu suchen. Ich habe gerade zufällig festgestellt, dass es mindestens einen Fall gibt, in dem es keinen IBOutlet-Ivar gibt, der nicht in der Dealloc-Methode freigesetzt wird.Analyse statischer IP-Codes aus Terminal schlägt fehlendes fehlendes ivar-release fehl

Hier ist der Inhalt des Befehls I aus dem Terminal laufen:

#!/bin/sh 
cd /Developer/svn/MyCompany/iPhone/MyApplication 
scan-build -analyzer-check-dead-stores -analyzer-check-llvm-conventions -analyzer-check-objc-mem -analyzer-check-objc-methodsigs -analyzer-check-objc-missing-dealloc -analyzer-check-objc-unused-ivars -analyzer-check-security-syntactic --experimental-checks -k -V -o scan-reports xcodebuild -configuration Debug -sdk iphonesimulator4.2 clean build 

ich aktualisierte auf die neueste Version von checker, so kann es nicht sein, dass es eine neuere Version von checker ist. Hier sind die relevanten Teile der H-Datei für meine Klasse:

@interface LoginWizardUsernameViewController : UIViewController <UITextFieldDelegate, GetUserExistsDidFinish> { 

IBOutlet UITextField *username; 
IBOutlet UIActivityIndicatorView *activityIndicatorView; 

} 

@property (nonatomic, retain) UITextField *username; 
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicatorView; 

Und hier sind die relevanten Teile der .m-Datei:

// lots o' code omitted here 

@implementation LoginWizardUsernameViewController 

@synthesize username; 
@synthesize activityIndicatorView; 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

Wie Sie sehen können, gibt es keine Veröffentlichung von die beiden IBOutlet-Elemente, aber obwohl sie in der Eigenschaftendefinition als beibehalten aufgeführt sind, sieht Checker das aus irgendeinem Grund nicht. Das Seltsame ist, dass ich in die .m-Datei anderer Klassen gehen und eine Version in der Dealloc-Methode kommentieren kann, und scan-build benachrichtigt mich am Ende des Scans des Problems. Ich kann einfach nicht herausfinden, was an dieser besonderen Situation anders ist.

Antwort

4

Dies ist ein bug im Clang statischen Analysator, verursacht durch einen Versuch, einen anderen issue zu beheben.

Basierend auf dem source code wird der Clang statische Analyzer überspringen -dealloc für jede Klasse überprüft die nur Nicht-Zeiger ivars oder IBOutlet ivars enthält:

104 // Does the class contain any ivars that are pointers (or id<...>)? 
105 // If not, skip the check entirely. 
106 // NOTE: This is motivated by PR 2517: 
107 //  http://llvm.org/bugs/show_bug.cgi?id=2517 
108 
109 bool containsPointerIvar = false; 
110 
111 for (ObjCInterfaceDecl::ivar_iterator I=ID->ivar_begin(), E=ID->ivar_end(); 
112  I!=E; ++I) { 
113 
114 ObjCIvarDecl* ID = *I; 
115 QualType T = ID->getType(); 
116 
117 if (!T->isObjCObjectPointerType() || 
118  ID->getAttr<IBOutletAttr>() || // Skip IBOutlets. 
119  ID->getAttr<IBOutletCollectionAttr>()) // Skip IBOutletCollections. 
120  continue; 
121 
122 containsPointerIvar = true; 
123 break; 
124 } 
125 
126 if (!containsPointerIvar) 
127 return; 

ich, dass es richtig einfach, wenn Sie arbeiten vermuten Fügen Sie Ihrer Klasse eine Nicht-IBOutlet-Eigenschaft hinzu.

+1

Update: Ich habe einen Fehlerbericht für dieses Problem eingereicht. http://llvm.org/bugs/show_bug.cgi?id=8838 –

+1

Direkt am Geld, fügte ich ein NSString beibehaltenes Element in der Klasse als eine Eigenschaft, und es begann plötzlich beschweren sich über die fehlenden Releases auf der IBOutlets. Vielen Dank. –

+0

Ehrfürchtig. Danke, dass Sie mich über die Ergebnisse informiert haben:) –