2011-01-27 2 views
0

Я поддерживаю проект 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.

ответ

2

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

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

+0

согласно Twitter:. ns_consumed не работает с 'недействительных *' указателями Это достаточно общая проблема для контекстных указателей/refcons/«закрытия» http://llvm.org/bugs/show_bug.cgi?id=9075 –

+0

Мое «решение» - прочитайте его и плачьте: 'static inline OOConsumeRefere nce (id __attribute __ (ns_consume) value) __attribute __ ((always_inline)) {возвращаемое значение; } ' –

+0

Я просто получаю неизвестный атрибут. Даже когда я заставляю Xcode 4 компилироваться с помощью «LLVM 2». – mxcl