Статический анализ кода iPhone из терминала не может найти отсутствующую версию ivar - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть скрипт, который я запускаю в терминале, который запускает анализ кода сканирования-сборки в моих приложениях для iPhone, чтобы проверить наличие проблем.Я просто случайно заметил, что есть хотя бы один случай, когда он не находит ивара IBOutlet, который не был выпущен в методе dealloc.

Вот содержимое команды, которую я запускаю из Терминала:

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

Я обновился до самой последней версии программы проверки, поэтому не может быть и более новой версии программы проверки.Вот соответствующие части файла .h для моего класса:

@interface LoginWizardUsernameViewController : UIViewController <UITextFieldDelegate, GetUserExistsDidFinish> {

 IBOutlet UITextField *username;
 IBOutlet UIActivityIndicatorView *activityIndicatorView;

}

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

А вот соответствующие части файла .m:

// lots o' code omitted here

@implementation LoginWizardUsernameViewController

@synthesize username;
@synthesize activityIndicatorView;

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

Как видите,нет выпуска двух элементов IBOutlet, но даже если они перечислены как сохраненные в определении свойства, средство проверки по какой-то причине этого не видит.Странно то, что я могу зайти в файл .m других классов и закомментировать выпуск в методе dealloc, и scan-build радостно предупреждает меня в конце сканирования проблемы.Я просто не могу понять, что отличается в этой конкретной ситуации.

1 Ответ

4 голосов
/ 21 декабря 2010

Это ошибка в статическом анализаторе Clang, вызванная попыткой исправить другую проблему .

На основе исходного кода , статический анализатор Clang пропустит -dealloc проверку для любого класса, который содержит только не указатель ivars или IBOutlet ivars:

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 свойство к своему классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...