首页 > 其他分享 >#盲盒+码# Clang Static Analyzer (2) CodeChecker

#盲盒+码# Clang Static Analyzer (2) CodeChecker

时间:2022-12-09 11:37:15浏览次数:67  
标签:分析 simple Clang CodeChecker reports Static Analyzer 工具

【本文正在参加「盲盒」+码有奖征文活动】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

缺陷列表示意图如下:

ckbuglist.png

分析结果统计信息如下:

ckstat.png

缺陷展示页面如下:

ckbugpage.png

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

ckstore.png

5、参考站点

本文作者:zhushangyuan_

想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com/#bkwz​

标签:分析,simple,Clang,CodeChecker,reports,Static,Analyzer,工具
From: https://blog.51cto.com/harmonyos/5924219

相关文章

  • #盲盒+码# Clang Static Analyzer (1) scan-build
    1、ClangStaticAnalyzer介绍Clang静态分析器CSA是一个源代码分析工具,可查找C、C++和Objective-C程序的bugs。目前可以从命令行中运行,或者如果您使用macOS,则可以在......
  • AFL(十七)qemu模式报错 util/memfd.c:40:12: error: static declaration of ‘memfd_cre
    qemu模式使用需要进入qemumode文件夹,然后运行那个sh脚本,但是会报错:util/memfd.c:40:12:error:staticdeclarationof‘memfd_create’followsnon-staticdeclarati......
  • static
    带static的方法,和不带static的方法,带静态修饰符的是普通方法,不带的是实例方法。实例方法不能直接引用,要先new对象,不然就会报错。不带static是对象级别的行为,带上stati......
  • static的三种用法
    ①static修饰局部变量局部变量的生命周期变长,通俗点说就是被static修饰的局部变量出了所限制的这个局部还能使用。②static修饰全局变量改变了变量的作用域-让静态的全......
  • C++学习笔记——static累加
    //#include<iostream>//usingnamespacestd;////classStu//{//public://staticintb;//静态成员无论赋值如何变化,一个静态成员只有一个空间//......
  • rfc3442-classless-static-routes 字段含义
    参考文档:https://www.nuomiphp.com/serverfault/zh/60480e758726d95932321906.html#dhcp配置optionrfc3442-classless-static-routescode121=arrayofinteger......
  • @TestInstance的使用 / @BeforeAll必须为static方法?
    @BeforeAllJunit5会在每个测试方法执行之前创建一个新的测试类实例,如果为每个测试方法都新创建实例,如何让@BeforeAll方法在只执行一侧的情况下,每个方法都可以使用到?在@Be......
  • C语言中static
    static表示全局或静态意思;在函数体内,静态变量具有记忆功能,即在函数被调用过程中,一个被声明为静态变量的值维持不变;在模块内,但在函数体外,作用域范围是有限制的,static类型的......
  • Day24:static关键字
    staticstatic关键字是静态的意思,可以修饰成员方法、属性。static修饰的特点:被类的所有对象共享可以通过类名调用,也可以通过对象名调用;推荐使用类名调用!publicclass......
  • C++学习笔记——static
    //#include<iostream>//usingnamespacestd;////classTen//{//private://staticintc;//当静态成员函数在私有成员下定义,类外不可对其进行访问......