Рассказ Clang Static Analyzer о сторонних библиотеках, владеющих ссылками - PullRequest
0 голосов
/ 28 января 2011

Я поддерживаю проект Objective-C, который использует библиотеку C, которая реализует среду сценариев для сбора мусора.В некоторых случаях мне нужно поместить сохраненный объект Objective-C в приватное поле объекта сценария.Затем объект Objective C освобождается в обратном вызове finalize.

Вызов для установки частного значения выглядит следующим образом с, как мы надеемся, очевидной семантикой:

if (!JS_SetPrivate(context, jsSelf, [self retain])) /* handle error */

Обратный вызов finalize делает это:

id object = JS_GetPrivate(context, jsSelf);
if (object != nil)
{
    [object clearJSSelf:jsSelf]; // Remove reference to JS wrapper.
    [object release];  // JS wrapper owned a reference.
    JS_SetPrivate(context, jsSelf, nil);
}

Clang Static Analyzer не возражает против случайного освобождения в обратном вызове finalize, но там, где изначально установлено значение, он говорит «Потенциальная утечка объекта, расположенного в строке N».

Есть ли аннотация или не уродливый шаблон, который подавил бы это сообщение?(Я бы предпочел не делать глупостей вроде [object performSelector:@selector(retain)]. Я также предпочел бы не связываться с заголовком, объявляющим JS_SetPrivate. Также обратите внимание, что значение, данное JS_SetPrivate, является произвольным указателем, а не обязательно целью-C объект.

1 Ответ

2 голосов
/ 28 января 2011

Вы можете использовать новый атрибут NS_CONSUMED в JS_SetPrivate:

http://clang -analyzer.llvm.org / annotations.html # attr_ns_consumed

...