clang静态分析器

补充:centos7.8安装llvm7
https://www.liangzl.com/get-article-detail-20723.html
clang 中文:
https://www.bookstack.cn/read/clang-llvm/clang-user-manual.md#MinGW-w64
clang以及clang静态分析器的安装,详见本人另一篇博客。
https://blog.csdn.net/weixin_43124861/article/details/102800113
静态分析比较好的总结:https://blog.csdn.net/cayman_2015/article/details/81744879
关于静态分析器和checker的更多实现细节,参见:http://clang-analyzer.llvm.org/checker_dev_manual.html
clang静态分析网址: http://clang-analyzer.llvm.org/
clang静态分析scan-build网址:http://clang-analyzer.llvm.org/scan-build.html
scan-build是当clang静态分析作为单独工具被调用时会用到。

1.静态分析(分析bug和内存溢出等)

程序分析分为动态分析和静态分析两种,其中静态分析是指不实际运行程序而通过词法分析、语法分析、控制流、数据流等技术对源码进行扫描分析,动态分析则相反。

1.clang静态分析器介绍

1.1

马尤尔·潘迪 (Mayur Pandey); 苏尤葛·撒达 (Suyog Sarda). LLVM Cookbook中文版 (Kindle 位置 3047-3049). 电子工业出版社. Kindle 版本.
Clang静态分析器是一种源代码分析工具,可以查找C,C ++和Objective-C程序中的错误。它既可以作为独立工具运行,也可以在Xcode中运行。 独立工具是从命令行调用的,旨在与代码库的构建一起运行。该分析器是100%开源的,并且是Clang项目的一部分。

1.2

源代码通过Clang语法分析后,生成了语法分析树(AST),任务不同就有不同的效果:1、作为编译器前端将AST翻译成为IR;2、作为静态分析工具对AST进行分析。

1.3

Clang自己定义了很多Checker,可以通过下面的命令行查出所有的checker,注意,每一种类型的bug,都有一种对应的checker。

>clang -cc1 -analyzer-checker-help

在这里插入图片描述
下面是一些clang静态分析器自带的一些检查器
在这里插入图片描述

1.3

当需要对单个源文件进行检测时,使用下面的命令进行检测:

>clang --analyze -Xanalyzer -analyzer-checker=

以上语句针对一般的单个文件的小程序实用,
当需要对大型文件进行分析的时候,就需要用到scan-buid这个自动化脚本,它是由perl语言编写而成的,使用如下:

> scan-build [options] [build options]

例如:

scan-build --use-c++ /usr/bin/clang++--use-analyzer=/usr/bin/clang  -enable-checkeryourself.checker -k make

上面这条指令,–use-c++指定了使用的C++编译器,
–use-analyzer指定使用的分析器,
-enable-checker指定需要使用到分析器,这个分析器可以是自己编写的分析器,默认情况下scan-build会开启一些核心的checker,可以通过指令查看:
scan-build–use-analyzer=/usr/bin/clang -h
这就会列出所有的checker,其默认开启的是前面会有"+"号,也可以使用-disable-checker关闭默认的checker。
检测完成,可以使用scan-view查看检测的结果。

2.解释scan-build

scan-build是LLVM的前端工具Clang所提供的静态分析工具,Scan-build 是一个命令行工具,它能够帮助使用者运行静态分析器检查他们的代码, 找出代码的缺陷。scan-build可以使用一个伪编译器代替原来那个可以正常构建你的项目的编译器。默认情况下,这个伪编译器使用gcc来编译你的代码,然后执行静态分析器进行代码分析。

代码结构分析与可视化。对代码结构进行分析,并将控制流程图和函数调用关系图以图形化形式显示。其中控制流程图针对单个函数,可清晰地了解函数的分支、跳转和循环结构;函数调用关系图针对一组函数,呈现函数间的调用与被调用关系。在查找软件bug以及详细设计文档编写中,利用此功能可提供极大方便。

3.clang静态分析器–小实验

实验内容:以除零错误为例,展示clang静态分器如何处理这个错误
实验须知:实验主要是通过 Clang 静态 分析器 对 代码 进行 静态 分析。 它 基于 Clang 和 LLVM 构建, 它 使用 的 静态 分析 引擎 是 一个 Clang 库, 因此 具有 较 高的 可 重用 性, 并 能够 在 不同 的 客户 端 中 使用。(源于llvm cookbook中对clang静态分析器的解释)

3.1.

首先新建一个源文件,源文件内容如下所示。
这里使用sublime编译器,sublime安装详见本人另一篇博客
sublime安装: https://blog.csdn.net/weixin_43124861/article/details/102795557

sub sa.c

在这里插入图片描述
在这里插入图片描述

3.2

其次,执行以下代码运行clang静态分析器
clang -cc1 -analyze -analyzer-checker=core.DivideZero sa.c
clang分析-------------分析检查器的名字-------------------------源文件

clang -cc1 -analyze -analyzer-checker=core.DivideZero sa.c

在这里插入图片描述

4.clang静态分析器–工作原理

1)程序中的每一条肯能路径都会被分析, 对于 每一种 类型 的 bug, 都有 一个 对应 的 checker。
2)执行 的 时候, 执行 轨迹 由 爆炸 图( exploded graph) 来 表示, 每一个 ExplodedGraph 上 的 节点 称为 ExplodedNode, 它 由 一个 ProgramState 对象( 表示 程序 的 抽象 状态), 以及 一个 ProgramPoint 对象( 表示 程序 的 相应 地址), 所 组成。
3)在 构建 ProgramState 的 时候, 每个 checker 都会 链接 到 分析器 的 核心。 每次 分析 引擎 探测 一个 新的 语句 的 时候, 它 会 通知 每一个 注册 的 checker 去 监听 这个 语句, 给 它 报告 bug 或者 修改 语句 的 机会。
4)每一个 checker 则 会 注册 不同 的 事件 和 回 调 函数, 例如 PreCall( 在 函数 调用 之前), DeadSymbols( 符号 失效) 等。 不同 的 事件 会 通知 不同 的 checker, 它们 也会 执行 不同 的 动作。
5)本实验使 用了 除 零 checker, 它 会 报告 除 零 的 错误。 这个 checker 注册 了 PreStmt 回 调, 在 语句 执行 之前 调用。 检查 下一 条 语句 的 运算符, 如果 是 除法 运算符, 则 检查 除数 是否 为 0, 如果 找到 可能 的 值 则 报告 bug。
6)checker与checker之间都是互相联通的,一个checker会用到其他checker检测。

关于静态分析器和checker的更多实现细节,参见http://clang-analyzer.llvm.org/checker_dev_manual.html

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值