infer使用
$[timeformat('2021-10-08T10:48:41+08:00')]

安装

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是一个数组, 想要过滤其他文件, 只需要增加路径即可。

111
111

参考资料