Ложно-положительный результат при статическом анализе кода в XCode 3.2 - PullRequest
0 голосов
/ 12 марта 2012

Я только что столкнулся с проблемой со статическим анализатором кода XCode XCode 3.2. Это показывает мне потенциальную утечку, которую я считаю неоправданной. Я просто хочу проверить с другими людьми и убедиться, что это действительно ложный положительный результат.

Вот основной код (в некотором теле функции):

NSError *error = nil;
NSData *urlData = /* ... */;
NSXMLDocument *doc = [[NSXMLDocument alloc] initWithData:urlData options:0 error:&error];
if (![self validateObject:doc withError:error]) {
    return;
}
// ...
[doc release];

Вот метод проверки, вызываемый выше:

- (BOOL)validateObject:(id)object withError:(NSError *)error {
    if (!object) {
        // do something meaningful...
        return NO;
    } else {
        return YES;
    }
}

XCode сообщает мне, что распределение документа является потенциальной утечкой, поскольку метод validate может вернуть NO, а release не будет отправлен в doc. Но на самом деле, если инициализация не удалась, initWithData: options: возвращает nil, и никакого вреда не причиняется. Документы даже утверждают это.

Итак, что говорят эксперты? Ложно или нет?

Бест, Харальд

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Это не ложный позитив, так как он делает правильные вещи.Но вы правы в том, что на практике вы не пропустите.Однако вы можете отключить анализ, поставив [doc release] перед преждевременным возвратом, или autorelease NSXMLDocument и не освободите его явно в конце метода.

Причина не ложнаяположительным является то, что анализатор не будет смотреть на то, что делает validateObject:withError:.Задача анализатора состоит в том, чтобы анализировать каждый метод в отдельности и не предполагать ничего о вызываемых им методах (кроме стандартного именования Какао, например new*, alloc/init*, copy* и т. Д. - обычная вещь, о которой вы читаете с ARC).Представьте, что вы немного изменили то, что сделал validateObject:withError:.Тогда вы можете получить утечку.Он предупреждает вас о необходимости изменить код, чтобы он стал безопасным.

Как говорит @JeremyP (намного лучше, чем я):

"Код нарушает инкапсуляцию. Вы должны знатьвнутренняя часть -validateObject: withError: понять, что фрагмент верхнего кода не поврежден. "

1 голос
/ 12 марта 2012

Статический анализатор недостаточно умен, чтобы знать, что ваш метод проверки всегда возвращает YES, когда объект не nil. И я бы на это тоже не рассчитывал. Вполне вероятно, что в будущем вы расширите логику вашего метода проверки, чтобы даже объекты, которые не nil, не обязательно проходили проверку. В этом случае вы могли бы ввести утечку. Поскольку отправка сообщения на nil не разрешена, я бы в любом случае отпустил (или произвел автоматическое восстановление) doc.

1 голос
/ 12 марта 2012

Статический анализатор в XCode не распознает это, потому что он может обнаруживать проблемы только в методе, а не в разных методах. Так что он не смотрит в validateObject, что он делает.

Если вы измените реализацию validateObject, может произойти утечка. Вы не должны полагаться на реализацию validateObject.

Вы должны исправить эту потенциальную утечку, выпуская автоматически NSXMLDocument.

NSXMLDocument *doc = [[[NSXMLDocument alloc] initWithData:urlData options:0 error:&error] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...