Построить и проанализировать ложное срабатывание при обнаружении утечки? - PullRequest
4 голосов
/ 09 декабря 2011

У меня есть этот код:

- (CGImageRef)createImageWithContext:(CGContextRef)context
{
    return CGBitmapContextCreateImage(context);
}

- (void)fooWithContext:(CGContextRef)context
{
    CGImageRef imgRef = [self createImageWithContext:context];
    CGImageRelease(imgRef);
}

Это сборка проекта Objective-C в Xcode с включенным ARC.Build and Analyze сообщает о двух ошибках: одна в строке CGBitmapContextCreateImage, идентифицирующая потенциальную утечку, и одна в CGImageRelease, отмечающая «Неверное уменьшение счетчика ссылок объекта, которому в данный момент не принадлежит вызывающая сторона».

Если я объединю эти две функции в одну:

- (void)fooWithContext:(CGContextRef)context
{
    CGImageRef imgRef = CGBitmapContextCreateImage(context);
    CGImageRelease(imgRef);
}

Я не получу предупреждений.

Ошибка статического анализа кода?Или я что-то здесь упускаю?

Ответы [ 2 ]

9 голосов
/ 09 декабря 2011

Согласно стандартным соглашениям о присвоении имен Какао, метод, начинающийся со слова create, должен возвращать не принадлежащую ему ссылку.Вы возвращаете сохраненный объект, но ожидается, что вы вернете не сохраненный объект.Таким образом, когда анализатор смотрит на -createImageWithContext:, он видит, что он должен вернуть не сохраненный объект, но фактически возвращает оставшийся объект.Отсюда первое предупреждение.

В -fooWithContext: он смотрит на ваш код и говорит: «Эй, в соответствии с моими соглашениями об именах, createImageWithContext: должен вернуть ссылку, не являющуюся владельцем.им не принадлежит! Это ПЛОХО! "Отсюда второе предупреждение.

Вы можете исправить это, изменив имя -createImageWithContext: на что-то, начинающееся с new, например -newImageWithContext:.Или вы можете аннотировать метод с помощью макроса cf_returns_retained , чтобы указать статическому анализатору, что метод возвращает ссылку на владельца.

0 голосов
/ 09 декабря 2011

Я бы предположил, что это «ложный положительный результат», который действительно имеет смысл:

Анализатор не знает, что возвращаемое значение в createImageWithContext: обязательно сбрасывается (возможно, вы вызываете createImageWithContext:где-то еще, где вы не делаете CGImageRelease впоследствии), и при этом он не знает, что imgRef в fooWithContext: был сохранен должным образом.

Мои 2 цента:)

...