infer 代码静态分析

静态代码分析工具,主要是为了提高我们的代码质量。
通常,我们提高代码质量的方式是通过CodeReview,但是这个过程耗费的人工和时间往往较大。并且随着代码量的增加人肉检测起来会更加费劲。不要指望测试同学能把所有的问题都测试到,潜在问题就更别指望了。定制一些规则,让机器帮我们完成一部分代码质量的检测,从而提高我们的工作效率。
 
 
都能检测啥:

潜藏的问题:
循环引用,未使用的代码,潜在的崩溃,命名规范等等
 
为优化决策提供依据:
圈复杂度:圈选复杂度指的是遍历一个模块时的复杂度,这个复杂度由if、switch、while、for循环,运算符&&||,以及决策点共同决定的,圈选复杂度在4以内低复杂度,5到7是中等复杂度,8到10是高复杂度,再往上就得考虑优化了。因为复杂度过高,可能需要更多的测试情况了。复杂度这个人工就不太好检测了。
NSPath:
一个方法所有可能执行的路径数量,执行路径太多,那么业务逻辑可能就太复杂了,是否考虑优化?
NCSS度量:
NCSS度量指的是不包含注释的代码行数,如果检测到多行代码没有注释,这种的就不太有利于代码的维护了
 
 
 
什么是Infer?
Infer是Facebook开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题。目前Facebook使用该工具来分析Facebook的App,包括Android、iOS、FacebookMessenger和Instagram等等。
 
官网:
https://fbinfer.com/
中文版:
https://infer.liaohuqiu.net/
 
Infer特性
1、支持Android和JavaInfer可检查Android和Java代码中的NullPointException和资源泄露。
2、支持iOS除了以上,Infer还可发现iOS和C代码中的内存泄露。
3、效率高,规模大,几分钟能扫描数千行代码;
4、支持增量及非增量分析
 
 
Infer工作流程
第一阶段,转化阶段:将源代码转成Infer内部的中间语言。类C语言使用Clang进行编译,java语言使用javac进行编译。编译的同时转成中间语言,输出到infer-out目录。
第二阶段,分析阶段分析infer-out目录下的文件,分析每个方法,如果出现错误会继续分析下一个方法,中间不会中断,但是会记录下出错的位置,最终将所有的错误进行汇总输出。•Infer检测的结果在infer-out目录下是JSON格式,叫report.json
Infer安装
环境要求,Python版本:大于等于2.7
•第一种:二进制文件安装从https://github.com/facebook/infer/releases页面获取最新版本infer-osx-vXX.tar.xz (以osx标识),安装。
open ~/.bash_profile
添加

export PATH="${PATH}:/'pwd'/infer-osx-v0.1.0/infer/infer/bin"

保存

source ~/.bash_profile

 
 
第二种:源码安装
1.1安装brew  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
1.2安装inferbrew install infer 安装达到100%后可通过`infer –version`查看infer版本信息1.3配置到环境变量
echo "export PATH=\"\$PATH:pwd/infer/infer/bin\"" \ >> ~/.bash_profile &&source ~/.bash_profile
 
 
 
 
 
 
Infer进行检测
以下以iOS项目为例
1.cd  到项目目录下面
cd  ........
2.clean 项目
3.开始检测
infer --keep-going --no-xcpretty -- xcodebuild -workspace
CodeDetectionDemo.xcworkspace -scheme CodeDetectionDemo -configuration Debug -
sdk iphonesimulator
 
或者
 

infer --keep-going --no-xcpretty -- xcodebuild -project CodeDetectionDemo.xcodeproj -config Debug -target CodeDetectionDemo

注意事项:项目路径中出现中文会导致检测失败
 
 
 
检测结果
成功,有错误和修改完成之后

infer 代码静态分析的更多相关文章

  1. Understand:高效代码静态分析神器详解(转)

    之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便了,但是却没有了静态代码分析工具,很幸运,前段时间找到一款比source ins ...

  2. C/C++代码静态分析插件 SourceInsight_Scan

    sourceinsight-scan 是一款集成在 SourceInsight 中的c/c++代码静态分析插件,集成了cppcheck,coverity,pclint等业界优秀的静态分析工具的优点. ...

  3. 代码静态分析工具PC-LINT安装配置

    代码静态分析工具PC-LINT安装配置--step by step                             作者:ehui928                             ...

  4. Understand:高效代码静态分析神器详解(一)

    Understand:高效代码静态分析神器详解(一) Understand   之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...

  5. 利用idea的code inspect功能进行代码静态分析

    利用idea.phpstorm系列的ide的code inspect功能可以开发出适用于各种编程语言的代码静态分析工具.这个功能大家可以自己实现扩展规则,规则也使用了visitor模式,规则里对关心的 ...

  6. Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/

    Understand:高效代码静态分析神器详解(一) | 墨香博客 http://www.codemx.cn/2016/04/30/Understand01/ ===== 之前用Windows系统,一 ...

  7. Understand:高效代码静态分析神器详解(一)【转】

    转自:http://www.codemx.cn/2016/04/30/Understand01/ 之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面, ...

  8. C++ 代码静态分析工具cppcheck【转】

    转自:http://blog.csdn.net/chen19870707/article/details/42393217 权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] c ...

  9. 代码静态分析工具-splint的学习与使用[转]

    代码静态分析工具--splint的学习与使用[转] 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.window ...

随机推荐

  1. [转载] 学会使用Web Service上(服务器端访问)~~~

    http://www.360doc.com/content/10/0712/12/541242_38461863.shtml# 关于什么是Web Service,相信在很多地方都会有介绍.简单的讲,W ...

  2. @JsonIgnore @JsonIdentityInfo 处理Hibernate 循环引用的问题

    enterprise和user一对一的关系: @Entity @Table(name = "enterprise") public class Enterprise extends ...

  3. java面向接口编程之适配器模式

    使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个方法,不想覆写其他的方法. 比如,窗体有变大,变小,关闭的行为,但是我现在只需要关闭行为;   package reviewDem ...

  4. Mysql5.7在忘记密码的情况下如何修改密码?

    1.停止服务 2.mysqld --skip-grant-tables 3.回车之后就不要动了,再新打开一个命令提示符窗口,同样进入mysql的安装目录下, 输入:mysql -u root -p 密 ...

  5. webpack学习(四)配置plugins

    1 plugins是什么??? 如果学过vue和react肯定知道生命周期函数,而生命周期函数实际上就是当程序运行在某个时刻一定会发生的函数. plugins其实也是如此,我们在项目中配置相应的plu ...

  6. Class对象的isAssignableFrom方法

    isAssignableFrom 在看一个开源代码时,在加载完某个Class对象后,经常会使用 java.lang.Class#isAssignableFrom 来校验下. 之前真没有注意过Class ...

  7. urlencode()与urldecode()

    urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%. urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其 ...

  8. H3C STP监控与维护

  9. 一个基于 Slab 缓存的 scull: scullc

    是时候给个例子了. scullc 是一个简化的 scull 模块的版本, 它只实现空设备 -- 永久 的内存区. 不象 scull, 它使用 kmalloc, scullc 使用内存缓存. 量子的大小 ...

  10. linux 注册一个 PCI 驱动

    为了被正确注册到内核, 所有的 PCI 驱动必须创建的主结构是 struct pci_driver 结构. 这个结构包含许多函数回调和变量, 来描述 PCI 驱动给 PCI 核心. 这里是这个结构的一 ...