40

Xcode 4静的アナライザーは、私のコードでいくつかの誤検知を報告します。それらを抑制する方法はありますか?

4

4 に答える 4

71

私は解決策を見つけました:誤検知(Appleシングルトンデザインパターンのような)は次の方法で回避できます:

#ifndef __clang_analyzer__

// Code not to be analyzed

#endif

Analyzerは、これらのプリプロセッサディレクティブ間のコードを分析しません。

于 2011-04-29T14:32:44.267 に答える
8

静的アナライザー(clang)が正しいことを行うのに役立つObjective-cメソッドとパラメーターに注釈を付けるためにいくつかの#defineを使用する方法を示すこのページを見てください

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

そのページから:

Clangフロントエンドは、GCCスタイルの属性とプラグマの形式でいくつかのソースレベルのアノテーションをサポートしており、ClangStaticAnalyzerの使用をより便利にするのに役立ちます。これらの注釈は、誤検知を抑制するだけでなく、アナライザーがバグを見つける能力を高めるのにも役立ちます。

于 2011-08-13T01:08:58.697 に答える
6

ここで私の答えを参照してください。ファイルにコンパイルフラグを追加すると、静的アナライザーはそれらを無視します。これは、あなたが気にしないサードパーティのコードにとってはおそらくより良いでしょう、そしてあなたが書いているファーストパーティのコードにとってはそうではありません。

于 2011-11-10T23:09:35.850 に答える
0

ほとんどの場合、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を除く)。

于 2016-02-24T21:13:25.293 に答える