Erzählen Sie Clang statischer Analysator über Bibliotheken von Drittanbietern, die Referenzen besitzen
-
26-10-2019 - |
Frage
Ich unterhalte ein Objektiv-C-Projekt, das eine C-Bibliothek verwendet, die eine müllgesammelte Skriptumgebung implementiert. In mehreren Fällen muss ich ein gehaltenes Objektiv-C-Objekt in das private Feld eines Skriptobjekts einstellen. Das Objective-C-Objekt wird dann in einem Abschlussabruf freigegeben.
Der Anruf, um den privaten Wert festzulegen, sieht mit hoffentlich offensichtlicher Semantik so aus:
if (!JS_SetPrivate(context, jsSelf, [self retain])) /* handle error */
Der Abschluss der Rückrufe erledigt dies:
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);
}
Der Clang Static Analyzer hat keine Einwände gegen die Zufallsfreisetzung im Abschlussabruf, aber wenn der Wert anfänglich festgelegt wird, heißt es: „Potenzielles Leck eines in Zeile N vergebenen Objekts.
Gibt es eine Annotation oder ein nicht-ugly-Muster, das diese Nachricht unterdrücken würde? (Ich würde lieber keine dummen Dinge tun wie [object performSelector:@selector(retain)]
. Ich würde es auch vorziehen, mich nicht mit dem Header zu deklarieren, der erklärt JS_SetPrivate
. Beachten Sie auch, dass der Wert zugegeben wird JS_SetPrivate
ist ein willkürlicher Zeiger, nicht unbedingt ein Objektiv-C-Objekt.
Lösung
Sie können das neue NS_Consumed Attribut auf JS_SETPRIVATE verwenden:
http://clang-analyzer.llvm.org/annotations.html#attr_ns_consumed