L'analyseur statique de Xcode 4 signale dans mon code quelques faux positifs. Existe-t-il un moyen de les supprimer ?
Réponses
Trop de publicités?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.
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).