Предупреждение статического анализатора Clang Аргумент нулевого указателя при вызове CFRelease

В Xcode 4.6 статический анализатор clang предупреждает меня об «аргументе нулевого указателя при вызове CFRelease».

Вот скриншот предупреждения анализатора:

Предупреждение статического анализатора Clang

И вот код на случай, если вы захотите его скопировать и вставить:

- (void)test
{
    CFUUIDRef aUUID = CFUUIDCreate(kCFAllocatorDefault);
    [self setUUID:aUUID];
    CFRelease(aUUID);
}

- (void)setUUID:(CFUUIDRef)uuid
{
    _uuid = uuid ? CFRetain(uuid) : CFUUIDCreate(kCFAllocatorDefault);
}

Я не понимаю, почему он предупреждает меня. aUUID никогда не может быть нулевым указателем, не так ли? Я научился больше не доверять себе, чем инструментам, которые использую, поэтому спрашиваю здесь. Я был бы очень рад, если бы кто-нибудь объяснил мне, чего мне не хватает.


person fzwo    schedule 06.02.2013    source источник
comment
CFUUIDCreate() может вернуть NULL в случае неудачного выделения, но логика предупреждения анализатора неверна. aUUID не изменяется в -setUUID:, поэтому независимо от того, где uuid имеет значение null или нет, aUUID все еще может быть нулевым.   -  person Fabian Kreiser    schedule 06.02.2013


Ответы (1)


Все, что возвращает выделенное значение, теоретически может вернуть NULL.

Анализатор следует нескольким возможным путям выполнения. При следовании сценарию «aUUID равен NULL» он в конечном итоге оказывается в CFRelease объекта NULL.

Дело не в том, что setUUID является причиной, это просто путь, по которому проблема была обнаружена, так что это путь, который проиллюстрирован.

person Paul Roub    schedule 26.04.2013