是否可以抑制Xcode 4静态分析仪警告?

时间:2011-04-27 14:53:13

标签: objective-c xcode4 clang clang-static-analyzer

Xcode 4静态分析器在我的代码中报告了一些误报。有没有办法压制它们?

4 个答案:

答案 0 :(得分:69)

我找到了一个解决方案:可以通过以下方式避免误报(如Apple单例设计模式):

#ifndef __clang_analyzer__

// Code not to be analyzed

#endif

Analyzer不会分析这些预处理程序指令之间的代码。

答案 1 :(得分:8)

看一下这个页面,它显示了如何使用几个#defines来注释objective-c方法和参数,以帮助静态分析器(clang)做正确的事情

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

从该页面开始:

  

Clang前端支持多个源级注释   GCC风格的属性和编译指示的形式,可以帮助使用   Clang静态分析仪更实用。这些注释都可以提供帮助   抑制误报以及提高分析仪的能力   发现错误。

答案 2 :(得分:6)

请参阅我的回答here。您可以向文件添加编译标志,静态分析器将忽略它们。对于您不关心的第三方代码,这可能更好,而不是您正在编写的第一方代码。

答案 3 :(得分:0)

大部分时间,使用CF_RETURNS_RETAINED之类的内容并按照'创建'规则适用于我,但我遇到了一个我可以 NOT 压制的案例。 终于找到了一种通过查看llvm源代码来抑制分析器的方法:

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

  

"测试我们是否在将指针存储到a时抑制错误   。全球"

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

由于某种原因,分配给静态数组没有抑制警告,但是分配给一个普通的静态数据的静态数据分析器&#39; 确实。 顺便说一下上面的方法,使用CGLayerRef是我发现重绘缓存图像的最快方法(除了OpenGL)。