Я поддерживаю проект Objective-C, который использует библиотеку C, которая реализует среду сценариев, собранную для мусора. В нескольких случаях мне нужно поместить сохраненный объект Objective-C в приватное поле объекта сценария. Объект Objective-C затем выдается в завершающем обратном вызове.Сообщить о Clang Static Analyzer о сторонних библиотеках, владеющих ссылками
Звонок установить личное значение выглядит следующим образом, с, надеюсь очевидной семантике:
if (!JS_SetPrivate(context, jsSelf, [self retain]) /* handle error */
финализации обратного вызова делает это:
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);
}
лязг Статический анализатор не имеет никаких возражений против случайного релиз в завершающем обратном вызове, но когда значение изначально установлено, оно говорит «Потенциальная утечка объекта, выделенного по строке N.»
Есть ли аннотации n или не уродливый шаблон, который подавляет это сообщение? (Я бы предпочел не делать глупых вещей, таких как [object performSelector:@selector(retain)]
. Я также предпочел бы не связываться с заголовком, объявляющим JS_SetPrivate
. Также обратите внимание, что значение, заданное JS_SetPrivate
, является произвольным указателем, не обязательно объектом Objective-C.
согласно Twitter:. ns_consumed не работает с 'недействительных *' указателями Это достаточно общая проблема для контекстных указателей/refcons/«закрытия» http://llvm.org/bugs/show_bug.cgi?id=9075 –
Мое «решение» - прочитайте его и плачьте: 'static inline OOConsumeRefere nce (id __attribute __ (ns_consume) value) __attribute __ ((always_inline)) {возвращаемое значение; } ' –
Я просто получаю неизвестный атрибут. Даже когда я заставляю Xcode 4 компилироваться с помощью «LLVM 2». – mxcl