Xcode 4静的アナライザーは、私のコードでいくつかの誤検知を報告します。それらを抑制する方法はありますか?
私は解決策を見つけました:誤検知(Appleシングルトンデザインパターンなど)は次の方法で回避できます:
#ifndef __clang_analyzer__
// Code not to be analyzed
#endif
アナライザーは、これらのプリプロセッサーディレクティブ間のコードを分析しません。
静的アナライザー(clang)が正しいことを行うのを助けるために、いくつかの#defineを使用してobjective-cメソッドとパラメーターに注釈を付ける方法を示すこのページを見てください。
http://clang-analyzer.llvm.org/annotations.html
そのページから:
Clangフロントエンドは、GCCスタイルの属性とプラグマの形式でいくつかのソースレベルの注釈をサポートしており、Clang静的アナライザーの使用をより便利にするのに役立ちます。これらの注釈は、誤検知を抑制するだけでなく、バグを見つけるアナライザーの機能を強化するのにも役立ちます。
私の答えを参照してください ここ 。ファイルにコンパイルフラグを追加すると、静的アナライザーはそれらを無視します。これは、あなたが書いているファーストパーティのコードではなく、あなたが気にしないサードパーティのコードにはおそらく良いでしょう。
ほとんどの場合、CF_RETURNS_RETAINEDのようなものを使用し、「作成」ルールに従うことは私にとってはうまくいきますが、[〜#〜]できない[〜#〜]というケースに遭遇しました。 )抑制します。最後に、llvmソースコードを調べてアナライザーを抑制する方法を見つけました。
https://llvm.org/svn/llvm-project/cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result
「グローバルへのポインタを格納するときにエラーを抑制するかどうかをテストしてください。」
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;
}
何らかの理由で、静的配列に割り当てると警告は抑制されませんでしたが、単純な古い静的配列 'sSuppressStaticAnalyzer'に割り当てると )。ちなみに、上記の方法では、CGLayerRefを使用することが、キャッシュされた画像を再描画するために私が見つけた最速の方法です(OpenGLを除く)。