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