如何用Xcode静态分析器命令行生成含循环引用警告的HTML报告?
问题描述
我已经安装了LLVM,并用scan-build对一个简单的Demo项目做静态分析。项目里故意写了循环引用代码,Xcode编辑器能立刻显示循环引用警告,但执行以下scan-build命令时,却提示未发现任何问题,最终也没生成分析报告:
scan-build xcodebuild -workspace RetainCycleDemo.xcworkspace -scheme RetainCycleDemo -configuration Debug -sdk iphonesimulator15.2
循环引用代码片段:
@interface ViewController () @property (nonatomic, copy) void(^aBlock)(void); @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.aBlock = ^{ NSLog(@"current vc = %p", self); }; self.aBlock(); }
我希望通过命令行静态分析工具检测这类循环引用问题,既然Xcode编辑器能识别,怎么让命令行工具生成包含这些警告的报告?或者有其他可用的命令行工具?
解决方案
1. 调整scan-build的Checker配置,启用循环引用检测
scan-build默认启用的Checker集合不包含Xcode编辑器里的全部静态分析规则,特别是Objective-C循环引用相关的检查需要手动开启。修改命令,添加-enable-checker参数启用对应的Checker:
scan-build -enable-checker core.ObjCRetainCount -enable-checker alpha.ObjCUnusedIVars xcodebuild -workspace RetainCycleDemo.xcworkspace -scheme RetainCycleDemo -configuration Debug -sdk iphonesimulator15.2
core.ObjCRetainCount:核心的Objective-C引用计数检查器,能检测循环引用、过度释放等问题alpha.ObjCUnusedIVars:实验性Checker,可辅助检测未使用的实例变量,补充循环引用相关检查
执行修改后的命令,scan-build应该能检测到循环引用并生成对应分析报告。
2. 使用Xcode原生的xcodebuild analyze命令
如果想和Xcode编辑器的警告完全对齐,直接用Xcode提供的xcodebuild analyze命令,它会复用Xcode默认的静态分析规则,无需额外配置Checker:
xcodebuild analyze -workspace RetainCycleDemo.xcworkspace -scheme RetainCycleDemo -configuration Debug -sdk iphonesimulator15.2
执行后,分析报告默认生成在~/Library/Developer/Xcode/DerivedData/目录下的对应项目文件夹中。若要指定报告路径,可添加-resultBundlePath参数:
xcodebuild analyze -workspace RetainCycleDemo.xcworkspace -scheme RetainCycleDemo -configuration Debug -sdk iphonesimulator15.2 -resultBundlePath ./AnalysisReport.xcresult
3. 第三方工具:OCLint
OCLint是一款开源静态分析工具,对Objective-C代码问题检测支持全面,包括循环引用。安装后可直接针对项目执行分析:
oclint -enable-global-analysis --workspace RetainCycleDemo.xcworkspace -scheme RetainCycleDemo
OCLint会输出详细的问题报告,涵盖循环引用、代码规范问题等,还支持将报告导出为HTML、JSON等格式。
原因说明
Xcode编辑器的静态分析基于Clang,但默认启用了更多针对iOS/macOS开发的Checker;而scan-build作为通用LLVM静态分析工具,默认仅启用基础Checker集合,因此需要手动添加Objective-C相关检查规则才能检测到循环引用。
内容的提问来源于stack exchange,提问作者P. Tsin

