Erzählen Sie Clang statischer Analysator über Bibliotheken von Drittanbietern, die Referenzen besitzen

StackOverflow https://stackoverflow.com/questions/4822178

  •  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.

War es hilfreich?

Lösung

Sie können das neue NS_Consumed Attribut auf JS_SETPRIVATE verwenden:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top