Xcode 4靜態分析器在我的代碼中報告了一些誤報。有什麼辦法可以壓制他們嗎?是否可以抑制Xcode 4靜態分析器警告?
回答
我找到了解決方法:假陽性(如蘋果singleton設計模式)可以被避免:
#ifndef __clang_analyzer__
// Code not to be analyzed
#endif
分析器不會分析這些預處理指令之間的代碼。
這會使分析時根本不編譯代碼嗎? – CarmeloS 2015-07-29 09:02:54
'__clang_analyzer__'是一個宏,在爲分析器編譯程序時定義(參見[Clang用戶手冊](http://clang.llvm.org/docs/UsersManual.html#analyzer_diagnositics))。 當它被定義時,'#ifndef'和'#endif'之間的代碼沒有被編譯,這意味着分析器沒有看到它。但是,如果未爲分析程序編譯程序,則宏未定義,代碼將按正常方式編譯。 – DreamOfMirrors 2015-07-29 09:20:05
有些東西告訴我,如果你取出一部分代碼,它可能無法編譯。或者你需要#else中的存根。我對嗎? – RavisMsk 2016-01-12 11:27:26
看看這個網頁,其中顯示瞭如何使用幾個#define語句來註釋Objective-C的方法和參數,以幫助靜態分析器(鐺)做正確的事
http://clang-analyzer.llvm.org/annotations.html
在這個頁面:
鐺前端支持在 形式GCC-style屬性和用法,可以幫助使用 鏘靜態分析器更多有用的幾個代碼級註解。這些註釋既可以幫助 抑制誤報,也可以幫助提高分析器的查找錯誤的能力。
這些註釋看起來像是比#ifndef __clang_analyzer__更好的選擇,因爲它們適用於任何使用它們的方法。例如:'@property(nonatomic,retain)NSString * newString NS_RETURNS_NOT_RETAINED;' – 2012-11-30 21:18:25
查看我的回答here。您可以向文件添加編譯標誌,靜態分析器將忽略它們。這可能對您不關心的第三方代碼更好,也可能不適用於您正在編寫的第一方代碼。
大部分時間,使用像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除外)的最快方法。
- 1. XCode /靜態分析器:抑制保留計數/泄漏警告
- 2. 抑制靜態代碼分析警告TryParse調用CA1806
- 3. CGImageCreateWithImageInRect靜態分析警告
- 4. 是否可以使用抑制性警告運行make?
- 5. XCode 4:靜態分析頭文件
- 6. 如何抑制在Xcode警告?
- 7. 抑制Xcode警告? 「weak_import」屬性忽略
- 8. clang scan-build編譯器警告報告?對於靜態分析
- 9. 抑制gcc警告:「警告:這是以前定義的位置」
- 10. 使用objc_msgSend時避免靜態分析器泄漏警告?
- 11. 抑制LNK4204警告
- 12. 抑制Autolayout警告
- 13. 抑制MySQL警告?
- 14. 抑制stream_socket_client警告
- 15. F#抑制警告
- 16. 我可以讓pylint警告抑制線是不必要的嗎?
- 17. 爲什麼CodeContracts靜態分析器不會發出警告?
- 18. 如何打開一個靜態分析警告?
- 19. #pragma警告不會抑制警告
- 20. 抑制Xcode 5中的「未聲明的選擇器」警告
- 21. 如何在Xcode上抑制「dead store」編譯器警告?
- 22. 抑制行特定的XCode編譯器警告
- 23. 抑制實例方法覆蓋鏈接器警告框架xcode
- 24. Xcode靜態分析器和copyWithZone
- 25. 如何抑制編譯器警告
- 26. 抑制編譯器警告C++
- 27. 全局抑制c#編譯器警告
- 28. 抑制:「#警告是語言擴展名」
- 29. 如何抑制MaxPermSize警告?
- 30. 抑制Ansible Ad Hoc警告
誤報?哪裏? – BoltClock 2011-04-27 14:54:35
假陽性是可能的,但很少見。請發佈您的代碼。 – bbum 2011-04-27 15:04:14
使用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