使用Infer进行静态代码扫描
安装Infer
在Mac上可以直接使用brew 来安装,比较简单
brew install infer
使用Infer
- Android
infer -- gradle build
- iOS
cd 到你的当前工程目录下
# 普通工程
infer run -- xcodebuild -target xxx -scheme xxx -configuration Debug -sdk iphonesimulator
# pod工程
infer run -- xcodebuild -workspace xxx.xcworkspace -scheme xxx -configuration Debug -sdk iphonesimulator
查看报告
脚本跑完之后在 infer-out/bugs.txt
查看结果
出现常见错误类型有:
NULL_DEREFERENCE:空指针的情况。
1.传参为0的情况下。例如代码中,在调用showAlertViewA()时,将tag传参为0,infer检测此处传0,判断为一个NULL空指针,所以爆出警告。这里可以理解为误报,不会出现问题。
2.通过malloc,calloc,realloc等函数申请内存,当内存不足时,有可能会在该函数中返回NULL,如果没有做NULL的判断,则警告
3.在创建NSArray或者NSDictionary时,传入的参数有可能会nil。由于NSArray与NSDictionary不接受空指针,所以在对其addObject或者setObject:forKey: 时需要进行判断一下是否为nil
MEMORY_LEAK:内存泄漏:
项目代码全面启动了ARC进行内存管理,在OC层没有扫描出内存泄露。目前扫描出的内存泄露问题都是使用了malloc或者ralloc等c语言内存申请函数,在函数提前return前没有及时free
RESOURCE_LEAK:资源泄漏
ASSIGN_POINTER_WARNING
由于在mrc时代,没有weak指针,所以一些view的属性声明是、unsafe__unretain_的形式,在arc中,这个属性被判断为assign,需要将其修改为weak或者strong
DIRECT_ATOMIC_PROPERTY_ACCESS
在代码中使用了使用了一个atomic的成员变量,infer建议我们将atomic修改为nonatomic。由于OC中,属性会被默认设置为atomic属性,我们需要显示将属性声明为nonatomic。
IVAR_NOT_NULL_CHECKED
在代码中调用block,运行代码时,没有做判空处理。即需要改动为,if(block){block()}
BAD_POINTER_COMPARISON
没有判断一个NSNumber类型的对象是不是空?
TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
代码中使用了cookie的value。可以理解为误报
PARAMETER_NOT_NULL_CHECKED
传参时没有判断是否为null,加一次判断就可以了
STRONG_DELEGATE_WARNING
将一个delegate属性设置为strong的类型。
PREMATURE_NIL_TERMINATION_ARGUMENT
没有判断是否为空
REGISTERED_OBSERVER_BEING_DEALLOCATED
创建一个对象后,监听了某些通知,但是没有在dealloc中释放该通知。项目中出现这种问题的类,基本都是单例,不会被销毁。