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. 是否可以使用抑制性警告运行make?
- 4. 抑制Xcode警告? “weak_import”属性忽略
- 5. 抑制gcc警告:“警告:这是以前定义的位置”
- 6. 使用objc_msgSend时避免静态分析器泄漏警告?
- 7. F#抑制警告
- 8. 我可以让pylint警告抑制线是不必要的吗?
- 9. 为什么CodeContracts静态分析器不会发出警告?
- 10. 抑制行特定的XCode编译器警告
- 11. 抑制实例方法覆盖链接器警告框架xcode
- 12. 全局抑制c#编译器警告
- 13. 如何抑制编译器警告
- 14. 抑制Ansible Ad Hoc警告
- 15. 在rpy2中抑制警告
- 16. 抑制Objective-C警告
- 17. 如何抑制MaxPermSize警告?
- 18. 抑制gfortran警告消息
- 19. 抑制rsOverlappingReportItems的警告
- 20. 抑制MatPlotLib良性警告
- 21. 抑制警告是否是一种好习惯?
- 22. 的XCode静态分析报告,当实例变量被分配
- 23. 如何在构建期间抑制静态代码分析?
- 24. Clang静态分析仪通过自动发布给出警告
- 25. Xcode 4存档警告,以跳过复制阶段
- 26. 是否有替代方法抑制xtree中不可达代码的警告?
- 27. 如何从外部库中抑制Xcode中的Thread Sanitizer警告?
- 28. 抑制Xcode中不推荐使用的警告
- 29. 分析器警告参数类型本身不可以
- 30. web解析器可以区分静态和动态文本吗?
误报?哪里? – 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