39 votes

Est-il possible de supprimer les avertissements de l'analyseur statique de Xcode 4 ?

L'analyseur statique de Xcode 4 signale dans mon code quelques faux positifs. Existe-t-il un moyen de les supprimer ?

70voto

DreamOfMirrors Points 1339

J'ai trouvé une solution : les faux positifs (comme le modèle de conception singleton d'Apple) peuvent être évités avec :

#ifndef __clang_analyzer__

// Code not to be analyzed

#endif

L'analyseur n'analysera pas le code entre ces directives du préprocesseur.

8voto

Logachu Points 365

Jetez un coup d'oeil à cette page qui montre comment utiliser plusieurs #defines pour annoter les méthodes et les paramètres d'objective-c afin d'aider l'analyseur statique (clang) à faire ce qu'il faut.

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

Extrait de cette page :

L'interface Clang prend en charge plusieurs annotations au niveau de la source dans l'élément sous la forme d'attributs et de pragmas de type GCC, qui peuvent faciliter l'utilisation de la Clang plus utile. Ces annotations peuvent à la fois aider à de supprimer les faux positifs et d'améliorer la capacité de l'analyseur à trouver des bogues.

6voto

kcharwood Points 1667

Voir ma réponse aquí . Vous pouvez ajouter un drapeau de compilation aux fichiers et l'analyseur statique les ignorera. C'est probablement mieux pour du code de tierce partie dont vous ne vous souciez pas, et pas pour du code de première partie que vous écrivez.

0voto

Keith Knauber Points 44

La plupart du temps, l'utilisation de choses comme CF_RETURNS_RETAINED et le respect de la règle de "création" me conviennent, mais j'ai rencontré un cas où je ne pouvais pas utiliser les données. PAS supprimer. J'ai finalement trouvé un moyen de supprimer l'analyseur en regardant le code source d'llvm :

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

"Test pour voir si nous supprimons une erreur lorsque nous stockons le pointeur vers un global".

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

Pour une raison quelconque, l'affectation à un tableau statique n'a pas supprimer l'avertissement, mais en l'assignant à une vieille statique "sSuppressStaticAnalyzer fait . D'ailleurs, la méthode ci-dessus, qui utilise CGLayerRef, est le moyen le plus rapide que j'ai trouvé pour redessiner les images mises en cache (en dehors d'OpenGL).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X