2011-04-27 93 views
38

Xcode 4静态分析器在我的代码中报告了一些误报。有什么办法可以压制他们吗?是否可以抑制Xcode 4静态分析器警告?

+0

误报?哪里? – BoltClock 2011-04-27 14:54:35

+2

假阳性是可能的,但很少见。请发布您的代码。 – bbum 2011-04-27 15:04:14

+0

使用Apple单身设计模式(请参见[创建单例实例](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html%23//apple_ref/doc)/uid/TP40002974-CH4-SW32)“可可基本指南”),分析仪会给出“在XX行分配的物体的潜在泄漏”。 – DreamOfMirrors 2011-04-27 15:12:05

回答

69

我找到了解决方法:假阳性(如苹果singleton设计模式)可以被避免:

#ifndef __clang_analyzer__ 

// Code not to be analyzed 

#endif 

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

+0

这会使分析时根本不编译代码吗? – CarmeloS 2015-07-29 09:02:54

+1

'__clang_analyzer__'是一个宏,在为分析器编译程序时定义(参见[Clang用户手册](http://clang.llvm.org/docs/UsersManual.html#analyzer_diagnositics))。 当它被定义时,'#ifndef'和'#endif'之间的代码没有被编译,这意味着分析器没有看到它。但是,如果未为分析程序编译程序,则宏未定义,代码将按正常方式编译。 – DreamOfMirrors 2015-07-29 09:20:05

+0

有些东西告诉我,如果你取出一部分代码,它可能无法编译。或者你需要#else中的存根。我对吗? – RavisMsk 2016-01-12 11:27:26

8

看看这个网页,其中显示了如何使用几个#define语句来注释Objective-C的方法和参数,以帮助静态分析器(铛)做正确的事

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

在这个页面:

铛前端支持在 形式GCC-style属性和用法,可以帮助使用 锵静态分析器更多有用的几个代码级注解。这些注释既可以帮助 抑制误报,也可以帮助提高分析器的查找错误的能力。

+1

这些注释看起来像是比#ifndef __clang_analyzer__更好的选择,因为它们适用于任何使用它们的方法。例如:'@property(nonatomic,retain)NSString * newString NS_RETURNS_NOT_RETAINED;' – 2012-11-30 21:18:25

6

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

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除外)的最快方法。