安装
1.安装brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2.安装infer
brew install infer
分析命令
1.分析单个文件
- cd InferTest.m 所在的目录
- infer -- clang -c InferTest.m
- No issues found 代表没有问题
2.分析整个项目
- cd 到项目所在的目录 (KooApp)为工程名称
infer -- xcodebuild -target KooApp -configuration Debug -sdk iphonesimulator
3.分析带cocoapods的整个项目
- cd 到项目所在目录
- KooApp代表项目名或者scheme名
infer -- xcodebuild -workspace ./KooApp.xcworkspace -configuration Debug -scheme KooApp
- 忽略过滤文件 (in-path后面跟的是一个忽略文件或者文件夹的路径数组。(clang也可以去掉))
INFER_ARGS="--skip-clang-analysis-in-path^[\"Pods\"]" infer -- xcodebuild -workspace ./KooApp.xcworkspace -configuration Debug -scheme KooApp
注意:如果infer分析编译报错,忽略错误继续分析
infer --keep-going
4.工程清理命令 注意:有时候发现编译分析结果不全,此时可以先清理一下,然后再编译
xcodebuild -target KooApp -configuration Debug -sdk iphonesimulator clean
5.cocoapods的项目清理命令
xcodebuild -workspace ./KooApp.xcworkspace -configuration Debug -scheme KooApp clean
问题分类总结
1.DIRECT_ATOMIC_PROPERTY_ACCESS
在代码中使用了使用了一个atomic的成员变量,infer建议我们将atomic修改为nonatomic。由于OC中,属性会被默认设置为atomic属性,我们需要显示将属性声明为nonatomic。
2.ASSIGN_POINTER_WARNING
由于在mrc时代,没有weak指针,所以一些view的属性声明是_、unsafe__unretain__的形式,在arc中,这个属性被判断为assign,需要将其修改为weak或者strong
3.NULL_DEREFERENCE
空指针
4.IVAR_NOT_NULL_CHECKED
在代码中调用block,运行代码时,没有做判空处理。即需要改动为, if(block){block()}
5.BAD_POINTER_COMPARISON
Implicitly checking whether NSNumber pointer is nil。没有判断一个 NSNumber类型的对象是不是空?此处应该是误报。
6.TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
代码中使用了cookie的value。可以理解为误报
7.PARAMETER_NOT_NULL_CHECKED
传参时没有判断是否为null,加一次判断就可以了
8.STRONG_DELEGATE_WARNING
将一个delegate属性设置为strong的类型。
9.PREMATURE_NIL_TERMINATION_ARGUMENT
没有判断是否为空
10.REGISTERED_OBSERVER_BEING_DEALLOCATED
创建一个对象后,监听了某些通知,但是没有在dealloc中释放该通知。项目中出现这种问题的类,基本都是单例,不会被销毁。
11.MEMORY_LEAK
内存泄露。项目代码全面启动了ARC进行内存管理,在OC层没有扫描出内存泄露。目前扫描出的内存泄露问题都是使用了malloc或者ralloc等c语言内存申请函数,在函数提前return前没有及时free。
检测可能会遇到的问题
1.分析某一个文件报错(fatal error: 'UIKit/UIKit.h' file not found) 解决方案: 在命令中加
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
举例:
infer -- clang -c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk Hellow.m
2.分析带ARC特有的修饰(如weak或者__weak)或者其他的情况(命令行中加-fobjc-arc)
infer -- clang -c -fobjc-arc InferTest.m
3.如果infer分析编译报错,忽略错误继续分析
infer --keep-going
4.有时候发现编译分析结果不全,此时可以先清理一下,然后再编译:
工程清理命令
xcodebuild -target InferTest -configuration Debug -sdk iphonesimulator clean
或者带cocoapods的项目清理命令
xcodebuild -workspace ./InferTest.xcworkspace -configuration Debug -scheme InferTest clean
然后再运行Infer分析的命令
过滤掉我们引入的第三库等不想做分析的文件
- 方法一: 而当我们在项目中使用了很多第三方的时候,其实我们只想让Infer分析我们的代码,而不想分析第三方的代码,不然分析报告中会有很多第三方的issue,看着混乱,这时我们可以用命令行过滤掉关于不想分析的文件。比如用到cocoapods的项目,我们想过滤掉Pods引入的第三方库,命令行如下:
INFER_ARGS="--skip-clang-analysis-in-path^[\"Pods\"]" infer -- xcodebuild -workspace ./KooApp.xcworkspace -configuration Debug -scheme KooApp
注:in-path后面跟的是一个忽略文件或者文件夹的路径数组。 (clang可能会去掉)
- 方法二: 在项目的根目录创建一个.inferconfig类型的配置文件 skip-analysis-in-path是一个数组, 想要过滤其他文件, 只需要增加路径即可。