当前位置: 首页 > 工具软件 > Infer > 使用案例 >

Infer的安装及基本使用

东郭海阳
2023-12-01

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

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

infer --help

使用

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

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

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

  • analysis:分析中间层

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

infer run -o /tmp/out -- make 

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

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

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

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

然后可以看到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

同时,我们还可以看见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

可以看到提供了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

上面的命令会把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
 类似资料: