2011-01-27 1 views
0

Je gère un projet Objective-C qui utilise une bibliothèque C qui implémente un environnement de script récupéré par la corbeille. Dans plusieurs cas, je dois placer un objet Objective-C conservé dans le champ privé d'un objet de script. L'objet Objective-C est ensuite libéré dans un rappel finalize.Explication de l'analyseur statique Clang sur les bibliothèques tierces propriétaires des références

L'appel à définir la valeur privée ressemble à ceci, avec la sémantique, espérons évidentes:

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

Le rappel Finaliser fait ceci:

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); 
} 

L'analyseur statique Clang n'a pas d'objection au hasard libérer dans le rappel finalize, mais où la valeur est initialement définie, il dit "fuite potentielle d'un objet alloué sur la ligne N."

Y at-il une annotatio n ou un modèle non-laid qui supprimerait ce message? (Je préfère ne pas faire des choses idiotes comme [object performSelector:@selector(retain)] Je préfère aussi ne pas jouer avec l'en-tête en déclarant JS_SetPrivate Notez également que la valeur donnée à JS_SetPrivate est un pointeur arbitraire, pas nécessairement un objet Objective-C

Répondre

2

Vous pouvez utiliser le nouvel attribut NS_CONSUMED sur JS_SetPrivate:

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

+0

Comme par Twitter. ns_consumed ne fonctionne pas avec des pointeurs 'void *' Ce problème est raisonnablement général pour les pointeurs contexte/refcons/« fermetures » http://llvm.org/bugs/show_bug.cgi?id=9075 –

+0

Ma "solution" - lisez-la et pleurez: 'static inline OOConsumeRefere nce (id __attribute __ (ns_consume) value) __attribute __ ((always_inline)) {valeur de retour; } ' –

+0

Je viens d'obtenir un attribut inconnu. Même quand je force Xcode 4 à compiler avec "LLVM 2". – mxcl

Questions connexes