zoukankan      html  css  js  c++  java
  • infer 代码静态分析

    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增量及非增量
    在第一次运行的时候,两种模式是一样的,都会对工程的所有文件进行编译检查,产生检查结果:
    增量模式:当已经产生分析结果后(build和infer-out文件夹),再执行编译命令,即为增量模式。如有代码没有改动,则此次不会有编译结果产生,如果代码有新的改动,此次只产生新的编译结果。这种以增量为基准的原则叫做增量模式。
     
    非增量模式:在删除了某个文件的情况下,运行文件,会输出所有的编译信息,即此时处于非增量模式。
     
    如果每次都想检测全部的代码:<增量模式----->>非增量>
     
    1、删除文件
    2、检测之前,刷新一下项目
    xcodebuild clean -workspace CodeDetectionDemo.xcworkspace -scheme CodeDetectionDemo
    -configuration Debug -sdk iphonesimulator12.1

    或者

    xcodebuild clean

     

  • 相关阅读:
    Sql与Asp.Net数据类型对应
    EditPlus 使用技巧集萃
    VB.NET and C# Comparison
    测试后行之CodeSmith模板
    ASP.NET需要改进的地方
    LeetCode: Minimum Path Sum
    LeetCode: Merge k Sorted Lists
    LeetCode: Merge Intervals
    LeetCode: Maximum Subarray
    LeetCode: Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/miaomiaocat/p/12192640.html
Copyright © 2011-2022 走看看