4

Clang Static Analyzer (2) CodeChecker

 1 year ago
source link: https://ost.51cto.com/posts/19827
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

#盲盒+码# Clang Static Analyzer (2) CodeChecker 原创 精华

【本文正在参加「盲盒」+码有奖征文活动】https://ost.51cto.com/posts/19288

Clang Static Analyzer (2) CodeChecker

1、Clang Static Analyzer介绍

Clang 静态分析器CSA是一个源代码分析工具,可查找 C、C++ 和 Objective-C 程序的bugs。
目前可以从命令行中运行,或者如果您使用 macOS,则可以在 Xcode 中使用。当从命令行中运行时,该工具和代码构建串联运行。
该分析器是100%开源的,是Clang项目的一部分。类似Clang的其他工具,它实现为C++库,可以被其他工具和应用调用。

2、Clang Static Analyzer命令行工具

静态分析器在设计上是一个 GUI 工具。其目的是找到程序中的错误执行路径,这些路径很难通过查看非交互式标准输出进行获取。但是,可以从命令行调用静态分析器来获取分析结果,稍后在图形界面中以交互方式查看分析结果。以下两个工具通常用于从命令行运行分析器,这两种工具都是封装的脚本,用于分析结果、调用底层的Clang编译器:

  • Scan-Build是一个古老而简单的命令行工具,可在编译项目时输出HTML文件。用于查看静态分析器警告。您可以在 Web 浏览器中查看分析结果。
    • 对于只想在办公桌上或在非常简单的协作环境中查看静态分析结果的个人开发人员非常有用。
    • 适用于所有主要平台(Windows,Linux,macOS),并且在许多Linux发行版中作为软件包提供。
    • 不包括对交叉翻译单元分析的支持cross-translation-unit analysis。
  • CodeChecker是一个 Web 服务器,它按需在项目上运行静态分析器,并维护问题数据库。
    • 非常适合在协作环境中管理大量静态分析器警告。
    • 通常比scan-build功能更丰富。
    • 支持增量分析:结果可以存储在数据库中,后续分析运行可以对比,列出新添加的缺陷。
    • 通过 CodeChecker 在 Linux 上完全支持交叉翻译单元 (Cross Translation Unit ,CTU) 分析。
    • 也可以运行clang-tidy checker检查器。
    • 开源,但是开源项目之外,即不是LLVM项目的一部分。

3、CodeChecker工具

CodeChecker 是一个静态分析工具,基于LLVM/Clang Static Analyzer工具链进行构建的,用来替代scan-build工具,可以用于Linux或macOS开发环境上。
CodeChecker工具属于python的库文件,维护在pypi上。安装该工具,使用命令如下:

pip3 install codechecker

还需要安装下cppcheck等,命令如下:

sudo apt-get install cppcheck

另外,需要使用下述环境变量,在~/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm/bin目录下有clang-tidy等命令行工具会使用到。

export PATH=~/openharmony/prebuilts/clang/ohos/linux-x86_64/llvm/bin:$PATH
export CC_LOGGER_GCC_LIKE="gcc:g++:clang:clang++:cc:c++"

4、CodeChecker基本用法

继续使用之前提供一个简单的示例文件simple.c,里面包含明显的错误。

#include <stdio.h>

struct S {
  int x;
};

void f(struct S s){
}

void test() {
  struct S s;
  f(s); // warn
}

int test2(int x){
  return 5/(x-x); // warn
}

int main(){
  test();
  test2(532);
  printf("Hej\r\r");
}

以及使用到的Makefile:

all: simple.c
	gcc -o simple_mk simple.c
clean:
	rm -f *.o simple_mk
	

4.1 CodeChecker log生成分析日志

执行如下命令,在编译的时候生成分析日志。

make clean
CodeChecker log -b "make" -o compile_commands.json

执行输出信息如下:

zhushangyuan@DESKTOP-RPE9R4O:~/CSA$ make clean
rm -f *.o simple_mk
zhushangyuan@DESKTOP-RPE9R4O:~/CSA$ CodeChecker log -b "make" -o compile_commands.json
[INFO 2022-12-06 21:11] - Starting build...
[INFO 2022-12-06 21:11] - Using CodeChecker ld-logger.
gcc -o simple_mk simple.c
simple.c: In function ‘test2’:
simple.c:16:11: warning: division by zero [-Wdiv-by-zero]
   return 5/(x-x); // warn
          ~^~~~~~
[INFO 2022-12-06 21:11] - Build finished successfully.

生成的文件内容比较简单:

[
        {
                "directory": "/home/zhushangyuan/CSA",
                "command": "/usr/bin/gcc -o simple_mk simple.c",
                "file": "simple.c"
        }
]

4.2 CodeChecker analyze分析工程

执行如下命令,输出分析报告。reports文件夹下主要是些plist文件,属于xml格式的文件,用于记录编译错误信息。

CodeChecker analyze compile_commands.json -o ./reports

4.3 CodeChecker parse查看分析结果

可以使用如下命令,使用纯文本方式展示分析出来的缺陷以及统计信息。

CodeChecker parse --print-steps ./reports

上述命令易读性较差,可以使用下述命令,在浏览器里查看。使用浏览器Firefox或MS Edge打开./reports_html/index.html即可。

CodeChecker parse ./reports -e html -o ./reports_html
firefox | msedge.exe ./reports_html/index.html

缺陷列表示意图如下:

#盲盒+码#  Clang Static Analyzer (2) CodeChecker-开源基础软件社区

分析结果统计信息如下:

#盲盒+码#  Clang Static Analyzer (2) CodeChecker-开源基础软件社区

缺陷展示页面如下:

#盲盒+码#  Clang Static Analyzer (2) CodeChecker-开源基础软件社区

4.4 CodeChecker store存储分析结果

可以使用CodeChecker server命令创建一个Web站点,然后执行CodeChecker store命令把分析结果存储在数据库。然后通过浏览器http://localhost:8555/Default进行网页访问,可以
在浏览器上对分析结果进行管理。

mkdir ./ws
CodeChecker server -w ./ws -v 8555 &
CodeChecker store ./reports --name my-project --url http://localhost:8555/Default
#盲盒+码#  Clang Static Analyzer (2) CodeChecker-开源基础软件社区

5、参考站点

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK