2010-12-17 3 views
2

問題を確認するためにiPhoneアプリケーションでスキャンビルドコードアナライザを実行する端末で実行するスクリプトがあります。私は、deallocメソッドで解放されていないIBOutlet ivarを見つけられないインスタンスが少なくとも1つ存在するという事実に気づいただけです。端末からのiPhone静的コード解析で欠落したivarのリリースが見つからない

は、ここで私は、ターミナルから実行するコマンドの内容です:

#!/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 

私はチェッカーの非常に最新バージョンに更新しているので、チェッカーの新しいバージョンがあることをすることはできません。 .mファイルの関連部分がここにいる

@interface LoginWizardUsernameViewController : UIViewController <UITextFieldDelegate, GetUserExistsDidFinish> { 

IBOutlet UITextField *username; 
IBOutlet UIActivityIndicatorView *activityIndicatorView; 

} 

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

そして:ここに私のクラスの.hファイルの関連部分がある

あなたが見ることができるように
// lots o' code omitted here 

@implementation LoginWizardUsernameViewController 

@synthesize username; 
@synthesize activityIndicatorView; 

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

、何のリリースはありません2つのIBOutlet項目がありますが、プロパティ定義に保持されているとしても、何らかの理由でチェッカーが表示されません。奇妙なことは、私が他のクラスの.mファイルに行き、deallocメソッドでリリースをコメントアウトして、問題のスキャンの最後にスキャンビルドがうれしく知らせることです。私はこの特定の状況について何が違うのか分かりません。

答えて

4

これは、別のissueを修正しようとしたために、Clangスタティックアナライザのbugです。

source codeに基づいて、クラン静的アナライザはのみ非ポインタアイバーズまたはIBOutletアイバーズが含まれている任意のクラスをチェック-deallocをスキップします:

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; 

私は単にあなたならば、それは正常に動作することを疑いますクラスに非IBOutletプロパティを追加します。

+1

更新:この問題のバグレポートを提出しました。 http://llvm.org/bugs/show_bug.cgi?id=8838 –

+1

私はお金の上で、プロパティとしてクラスのNSString保持アイテムを追加しました。 IBOutlets。ありがとう。 –

+0

私に結果を知らせてくれてありがとう ':)' –

関連する問題