iOS开发之使用 infer静态代码扫描工具
infer是Facebook 的 Infer 是一个静态分析工具。可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。
任何人都可以使用 infer 检测应用,可以将严重的 bug 扼杀在发布之前,同时防止应用崩溃和性能低下。

infer 可以检查 Java 和 Android 中的 NullPointException 和资源泄漏。
除了以上,infer 还可以检测 iOS 和 C 代码的内存泄漏!
应用范围:
包括 Facebook Android 和 iOS 主客户端,Facebook Messenger, Instagram 在内的,以及其他影响亿万用户的手机应用,每次代码变更,都要经过 Infer 的检测。
infer 优点:
1、效率高、规模大,几分钟能扫描上千行代码;
2、支持增量及非增量分析;
3、分解分析,输出整合结果(infer能将代码分解,小范围分析后再将结果整合在一起,兼顾分 析的深度和速度) ;
在 iOS 和 C 中,infer 能捕捉的 bug 类型有:
1、资源泄漏;
2、内存泄漏;
3、null 引用;
4、Premature nil termination argument
只在 OC 中捕捉的 bug 类型有:
1、循环引用(Retain cycle);
2、参数非空检查;
3、实例变量非空检查;
Github 地址:https://github.com/facebook/infer
配置 infer 安装:
1、homebrew 安装:
brew install infer
如果安装报错,可根据提示信息更新 brew:brew update
安装成功之后,输入 infer --version 来查看版本号:

配置到环境变量:
echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile
使用 infer 工具进行代码分析:
分析单个文件:
分析工程:
infer run -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphonesimulator
如果是 Pod 工程,执行:
infer run -- xcodebuild -workspace AVRecorder.xcworkspace -scheme AVRecorder -configuration Debug -sdk iphonesimulator
ps:被这个 infer run 命令给坑了,按照其他人博客上的命令:infer -- xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator
出现错误:
** BUILD FAILED ** Internal Error: /usr/local/Cellar/infer/0.15./lib/infer/infer/bin/../lib/python/infer.py
-j --project-root
/Users/zhangtibin/Downloads/infer-master/examples/ios_hello --out
/Users/zhangtibin/Downloads/infer-master/examples/ios_hello/infer-out --
xcodebuild -project HelloWorldApp.xcodeproj -scheme HelloWorldApp
-configuration Debug:
exited with code
Error backtrace:
Raised at file "base/Die.ml" (inlined), line , characters -
Called from file "base/Logging.ml", line , characters -
Called from file "integration/Driver.ml", line , characters -
Called from file "integration/Driver.ml", line , characters -
Called from file "infer.ml", line , characters -
Called from file "infer.ml", line , characters -
改成命令:infer run -- xcodebuild -target <target name> -configuration <build configuration> -sdk iphonesimulator 后解决。

其他用法命令可参考:https://fbinfer.com/docs/analyzing-apps-or-projects.html#xcodebuild
如果出现:Nothing to compile. Try cleaning the build first.
可使用:xcodebuild -target HelloWorldApp -configuration Debug -sdk iphonesimulator clean,保证增量到非增量转换。

添加静态分析工具忽略文件:
在工程目录下新建 .inferconfig 文件, 内容如图, 可以过滤掉Pods文件夹下的第三方库, skip-analysis-in-path是一个数组, 想要过滤其他文件, 只需要增加路径即可

出现常见错误类型有:
1、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
2、MEMORY_LEAK:内存泄漏:
5、DIRECT_ATOMIC_PROPERTY_ACCESS
在代码中使用了使用了一个atomic的成员变量,infer建议我们将atomic修改为nonatomic。由于OC中,属性会被默认设置为atomic属性,我们需要显示将属性声明为nonatomic。
6、IVAR_NOT_NULL_CHECKED
在代码中调用block,运行代码时,没有做判空处理。即需要改动为,if(block){block()}
7、BAD_POINTER_COMPARISON
没有判断一个NSNumber类型的对象是不是空?
8、TAINTED_VALUE_REACHING_SENSITIVE_FUNCTION
代码中使用了cookie的value。可以理解为误报
9、PARAMETER_NOT_NULL_CHECKED
传参时没有判断是否为null,加一次判断就可以了
10、STRONG_DELEGATE_WARNING
将一个delegate属性设置为strong的类型。
11、PREMATURE_NIL_TERMINATION_ARGUMENT
没有判断是否为空
12、REGISTERED_OBSERVER_BEING_DEALLOCATED
创建一个对象后,监听了某些通知,但是没有在dealloc中释放该通知。项目中出现这种问题的类,基本都是单例,不会被销毁。
iOS开发之使用 infer静态代码扫描工具的更多相关文章
- 静态代码扫描工具PMD定制xml的规则(一)操作篇
0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...
- Lint——Android SDK提供的静态代码扫描工具
Lint和FindBugs一样,都是静态代码扫描工具,区别在于它是Android SDK提供的,会检查Android项目源文件的正确性.安全性.性能.可用性等潜在的bug并优化改进. 下图简单地描述了 ...
- 静态代码扫描工具使用教程 - SonarQube+SonarScanner
预置条件: Jdk已安装 Mysql已安装 1. 下载 SonarQube和Sonar scanner. SonarQube: http://www.sonarqube.org/downloads/ ...
- 【Lua篇】静态代码扫描分析(一)初步介绍
一.静态代码分析 静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段.通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问 ...
- 使用OClint进行iOS项目的静态代码扫描
使用OClint进行iOS项目的静态代码扫描 原文链接:http://blog.yourtion.com/static-code-analysis-ios-using-oclint.html 最近需要 ...
- iOS开发 swift 3dTouch实现 附代码
iOS开发 swift 3dTouch实现 附代码 一.What? 从iphone6s开始,苹果手机加入了3d touch技术,最简单的理解就是可以读取用户的点击屏幕力度大小,根据力度大小给予不同的反 ...
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...
- java静态代码分析工具infer
infer是一个静态代码分析工具,探测bugs. 主要支持Java.C/C++ 安装:brew install infer 在线展示:https://codeboard.io/projects/115 ...
- DEVOPS技术实践_05:sonar静态代码扫描
一.SonarQube静态代码扫描平台 1.1 安装 https://www.sonarqube.org/官网 1.2 下载软件包 https://www.sonarqube.org/download ...
随机推荐
- os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)
centos 安装 elasticsearch的时候 因为 elasticsearch默认 需要 2G内存导致的镜像不能运行 解决方案 修改配置文件 find / -name jvm.options ...
- start.sh在linux下启动报错 Can't connect to any repository: ,cannot open git-receive-pack
个人博客 地址:http://www.wenhaofan.com/article/20181223135418 报错信息 Can't connect to any repository: ,canno ...
- C++中多态实现的关键——虚函数
1.多态的作用 在面向对象程序设计中,使用多态能够增强代码的可扩充性,,即程序需要增加或修改部分功能时,只需修改少量代码就能够达到目的,此外多态也能起到精简代码的作用. 而实现多态的关键点,就是虚函数 ...
- Java基础--数组(Arrays)
数组(Array),是多个相同类型数据按一定顺序排列 的集合,并使用一个名字命名,并通过编号的方式 对这些数据进行统一管理.本篇博客是对Java基础中的数组进行详细说明. 目录: 数组的概述 一维数组 ...
- JDBC添加为null的数据报错
定义实体类的时候定义为了基本数据类型,不能接收null需要改为引用数据类型
- 3ds Max File Format (Part 6: We get signal)
Let's see what we can do now. INode *node = scene.container()->scene()->rootNode()->find(uc ...
- 如何把U盘的两个盘或者多个盘合成一个
1.插入U盘,导出所有重要数据. 2.右击我的电脑,点管理打开设备管理器. 3.在设备管理器里找到磁盘管理. 4.在磁盘管理右侧出现下图: 5.如图是windows 7的界面. 6.找到U盘,图上是磁 ...
- 题解 【Codeforces988E】Divisibility by 25
本题是数论好题! 首先我们需要了解一个关于数论的性质: 一个数只要后两位能被25(或4)整除,这个数就能被25(或4)整除. 同理,后三位:(或8).后四位:(或16)亦是如此. 所以,我们只需要判断 ...
- Centos7添加软链接
1.pycharm添加软连接: 命令行模式中输入命令: ln -s /root/pycharm-2018.1/bin/pycharm.sh /usr/bin/pycharm ps:代码中/root/p ...
- 在PDB级别中如何切换或重建UNDO表空间
Oracle 12.1版本中,UNDO表空间仅存在CDB级别(共享UNDO),来自于AskScuti博客园. Oracle 12.2版本开始,UNDO表空间同时可以存在每个PDB级别(本地UNDO). ...