• Infer的安装及基本使用


    Infer的官网:https://fbinfer.com/docs/getting-started

    本文主要介绍Facebook公司的静态分析工具Infer的安装和基本使用。

    infer支持C,Objective-C,Java等语言。

    支持的bug类型可以在该链接处查询:https://fbinfer.com/docs/all-issue-types

    安装

    从该链接下载release包:https://github.com/facebook/infer/releases

    然后解压后,输入以下命令软链接到系统的路径。

    sudo ln -s "你的infer的路径" /usr/local/bin/infer
    
    • 1

    如果安装成功,输入help命令应该会显示相关信息。

    infer --help
    
    • 1

    使用

    在使用infer之前,确保测试的程序已经是clean过的状态。(执行make clean)

    infer分析的流程主要有两步。

    • capture:将源码翻译为infer自己的中间层语言

    • analysis:分析中间层

    infer默认是将翻译过来的中间语言存储在使用infer命令的那个目录下的infer-out/\ 。如果要更换存储目录的名字,可以用-o选项。

    infer run -o /tmp/out -- make 
    
    • 1

    在分析步骤中,infer会在中间语言对每个函数进行分析。如果发现一个函数中的错误,他会停止分析该函数,但是其他函数还是会继续分析的。

    报告的结果会存放在`infer-out/report.txt`中。

    现在我们来实际测试libpng试试看看,

    #在libpng的目录下
    export LLVM_COMPILER=clang
    ./autogen.sh
    ./configure --disable-shared
    # 如果是之前就make过的话,需要加上make clean的命令
    # 运行infer
    ./infer run -- make
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后可以看到infer-out目录下的report.txt报告了26个issue。

    #0
    pngset.c:583: error: Dead Store
      The value written to &max_palette_length (type int) is never used.
      581.       return;
      582. 
      583.    max_palette_length = (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
                                   ^
      584.       (1 << info_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
      585. 
    
    ...
    
    #25
    png.c:4134: error: Null Dereference
      pointer `table` last assigned on line 4126 could be null and is dereferenced at line 4134, column 10.
      4132.    else
      4133.       for (i=0; i<256; ++i)
      4134.          table[i] = (png_byte)(i & 0xff);
                     ^
      4135. }
      4136. 
    
    Found 26 issues
                    Issue Type(ISSUED_TYPE_ID): #
                        Dead Store(DEAD_STORE): 14
            Null Dereference(NULL_DEREFERENCE): 7
      Uninitialized Value(UNINITIALIZED_VALUE): 4
                  Resource Leak(RESOURCE_LEAK): 1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    同时,我们还可以看见infer-out目录下有以下文件

    bugs.txt                   costs-report.json  report.json  results.db      results.db-wal
    config-impact-report.json  logs               report.txt   results.db-shm  tmp
    
    
    • 1
    • 2
    • 3

    可以看到提供了db和json格式的report。另外,bugs.txt中的内容是

    The contents of this file have moved to report.txt.

    对于一些错误,比如空指针解引用,还可以使用infer explore命令获取到bugs的trace。e.g.

    infer explore --select 25 --html
    
    • 1

    上面的命令会把25号issue的bug trace打印出来。如果要打印全部的话,可以把25替换为all。html参数是将结果保存为html,默认是不加的。

    遇到的问题

    问题1:运行infer run — make时报错CRITICAL: No compiler set. Please set environment variable LLVM_COMPILER

    输入以下命令即可解决:

    export LLVM_COMPILER=clang
    
    • 1
  • 相关阅读:
    硬件基础:电阻
    【C#项目实战】控制台游戏 勇士斗恶龙(2)——游戏场景的设置以及玩家战斗逻辑
    python激活虚拟环境env报错:no such file or directory: env/Scripts/activate
    一文详解视觉Transformer模型压缩和加速策略(量化/低秩近似/蒸馏/剪枝)
    移动设备管理(MDM):密码管理
    Makefile 语法及使用笔记
    IPSec站点到站点 配置实例
    卷积导向快速傅里叶变换(FFT/NTT)教程
    【RocketMQ系列九】SpringCloudStream整合RocketMQ
    从 SQL 查询优化技巧去看 h2 数据库查询原理
  • 原文地址:https://blog.csdn.net/u013648063/article/details/126216139