Frage

Der Xcode 4 statische Analysator berichtet in meinem Code einige Fehlalarme. Gibt es eine Möglichkeit, sie zu unterdrücken?

War es hilfreich?

Lösung

Ich habe eine Lösung gefunden: Fehlalarme (wie das Apple Singleton -Designmuster) können vermieden werden mit:

#ifndef __clang_analyzer__

// Code not to be analyzed

#endif

Der Analysator analysiert den Code nicht zwischen diesen Präprozessor -Richtlinien.

Andere Tipps

Schauen Sie sich diese Seite an, auf der angezeigt wird, wie mehrere #Defines verwendet werden, um Objektivmethoden und Parameter zu kommentieren, um dem statischen Analysator (Clang) das Richtige zu unterstützen

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

Von dieser Seite:

Das Clang-Frontend unterstützt mehrere Annotationen auf Quellenebene in Form von Attributen und Pragmas im GCC-Stil, die dazu beitragen können, den statischen Analysator des Clang nützlicher zu machen. Diese Anmerkungen können sowohl die falschen positiven Aspekte unterdrücken als auch die Fähigkeit des Analysators, Fehler zu finden, verbessern.

Siehe meine Antwort hier. Sie können dem Dateien ein Kompilierflag hinzufügen, und der statische Analysator ignoriert sie. Dies ist wahrscheinlich besser für den Code von Drittanbietern, über den Sie sich nicht besorgt haben, und nicht für den ersten Parteicode, den Sie schreiben.

Meistens funktioniert die Verwendung von Dingen wie cf_returns_retained und der Verfolgung der 'Erstellung' Regel für mich, aber ich bin auf einen Fall gestoßen, den ich konnte NICHT unterdrücken. Fand schließlich einen Weg, den Analysator zu unterdrücken, indem Sie sich LLVM -Quellcode ansehen:

https://llvm.org/svn/llvm-project/cfe/trunk/test/arcmt/objcmt-arc-cf-notations.m.result

"Testen Sie, ob wir einen Fehler unterdrücken, wenn wir den Zeiger auf einen globalen Speicher speichern."

static CGLayerRef sSuppressStaticAnalyzer;
static CGLayerRef sDmxImg[2][2][1000]; // a cache of quartz drawings.
CGLayerRef CachedDmxImg(...) // which lives for lifetime of app!
{
    ...

    CGLayerRef img = sDmxImg[isDefault][leadingZeroes][dmxVal];
    if ( !img )
    {
        NSRect imgRect = <some cool rectangle>;

        [NSGraphicsContext saveGraphicsState];
        CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
        CGLayerRef cgLayerRef = CGLayerCreateWithContext(ctx, imgRect.size, NULL);
        CGContextRef layerCtx = CGLayerGetContext(cgLayerRef);
        [NSGraphicsContext setCurrentContext: [NSGraphicsContext graphicsContextWithGraphicsPort:layerCtx flipped:YES]];

        ... draw some gorgeous expensive Quartz stuff ...

        img = cgLayerRef;
        sDmxImg[isDefault][leadingZeroes][dmxVal] = cgLayerRef;
        sSuppressStaticAnalyzer = cgLayerRef; // suppress static analyzer warning!
        [NSGraphicsContext restoreGraphicsState];
   }
   return img;
}

Aus irgendeinem Grund, einem statischen Array zuzuweisen nicht Unterdrückung die Warnung, aber einem einfachen alten statischen "sSuppressstaticanalyzer" zuzuweisen tut. Übrigens ist die obige Methode, mit CGlayerRef die schnellste Art und Weise zu verwenden, wie ich zwischengespeicherte Bilder (neben OpenGL) neu gezogen habe.

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