clang静态分析器

2023-10-27

补充: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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clang静态分析器 的相关文章

随机推荐

  • Selenium成长之路-07简单对象定位之tag name方法

    继续学习元素定位 tag name 每个前端开发人员 都有自己的习惯 所以 不一定每一个开发人员都喜欢用id name来做标签 所以我们就需要掌握其他的定位方法 例如tag name 下面我们继续来进行百度首页的定位 可以看到首页下图中红框
  • linux命令---GNU awk介绍

    概述 gawk是GNU工程 是一种编程语言 它实现了标准awk的所有功能 用于在linux unix下对文本和数据进行处理 数据可以来自标准输入 stdin 一个或多个文件 或其它命令的输出 它支持用户自定义函数和动态正则表达式等先进功能
  • Qt 使用openssl库

    在windows下面 QT开发使用ssl库一开始总会有些问题 这里记录一下最近解决的找不到库的经过 安装QT时如果选择了支持openssl 那么qt就会编译一个版本的openssl库 通常会放在几个地方 这里就不多说了 在安装目录找一找就是
  • PTAL1-016 查验身份证 c++实现 多种方法 多种细节

    目录 先上代码 我遇到的问题 首先 对题目的理解 其次 是对代码的优化问题 最后 返回值 多种解法 1 换种数据结构 2 back 函数 3 类 先上代码 include
  • 如何在app store营销之实战技巧(6)

    是的 偶不算程序员 试头像 秀一下业娱作品 第520贴 献给我爱的XXX google docs被墙了 chrome os 2009 iPhone全球技术巡讲 北京站参会确认 邮件收到了 哈哈 恭喜Dr Stone Wars Lite升级啦
  • vue实现给页面添加水印

    第一步 先封装以下文件 创建utils watermark js文件 水印添加方法 let setWatermark str1 str2 gt let id 1 23452384164 123412415 if document getEl
  • 华为机试练习(十)求第K多连续重复子串

    题目描述 给定字符串 str 和正数 K 求出现次数第 k 多的重复的子串 样例输入 AAAAHHHBBCDHHHH 3 样例输出 2 说明 A 4 H 4 H 3 B 2 C 1 D 1 求第3次数多的 本来应该是H 但是由于H在之前已经
  • JS实现注册登录发送短信验证码动态显示60S倒计时完整案例

    通常在web项目中都会遇到账户注册或者忘记密码时需要发送短信验证码的功能 虽然说这种功能很常见 但是实际开发过程中很多人还会遇到不少坑 笔者经过整理把最近项目中的用到的这个发送短信验证码动态显示60S倒计时的完整实现过程分享给广大开发者朋友
  • Spring 整合 MyBatis

    前文介绍了Spring最基本的功能 Spring是一个DI 依赖注入 容器和AOP 面向切面 容器 但这仅仅是手段 远不是目标 Spring的目标是整合与简化其他Java框架的开发 通过DI管理其他框架和组件 利用AOP分离繁复部分 使得复
  • 帮我写个matlab输出扫频信号的代码

    当然 我可以帮你写一个Matlab输出扫频信号的代码 以下是一个简单的例子 定义扫频信号的起始频率 结束频率和时间间隔 f start 0 f end 1000 t step 0 001 生成时间序列 t 0 t step 1 生成扫频信号
  • vue 上传多个文件显示进度条

    组件A中的上传功能
  • docker-compose 安装nacos(单机版本)

    https gitee com yuanshuai likeit nacos docker git cd usr local docker git clone https gitee com yuanshuai likeit nacos d
  • react 图像识别_无法在React中基于URL查找图像

    react 图像识别 If you re new to React and are having trouble accessing images stored locally you re not alone 如果您不熟悉React 并且
  • python+selenium 浏览器无界面模式运行

    以Chrome浏览器为例 方法一 from selenium webdriver import Chrome ChromeOptions opt ChromeOptions 创建Chrome参数对象 opt headless True 把C
  • Redis主从复制时master_link_status:down的问题

    Redis进行主从复制时 在6380端口使用slaveof 127 0 0 1 6379 结果出现master link status down的问题 出现这个情况是由于主机使用有密码 需要在从机的配置文件redis6380 conf加入m
  • [SDOI2017]树点涂色

    洛谷 SDOI2017 树点涂色 题目描述 Bob 有一棵 n n n 个点的有根树 其中 1 1 1 号点是根节点 Bob 在每个点上涂了颜色 并且每个点上的颜色不同 定义一条路径的权值是 这条路径上的点 包括起点和终点 共有多少种不同的
  • linux系统中的用户态和内核态

    linux系统中的用户态和内核态 文章目录 linux系统中的用户态和内核态 TOC 文章目录 定义 一 Linux系统简介 Linux内核结构 二 总结 定义 在Linux系统中 用户态和内核态是两种不同的运行模式 它们主要区别在于程序所
  • ARM-Linux(mini2440)串口与51单片机的9位串口通讯

    ARM Linux mini2440 串口与51单片机的9位串口通讯 2013 03 10 16 09 34 转载 标签 9bit串口 arm linux 51单片机 分类 技术之路 ARM Linux mini2440 串口与51单片机的
  • 日期类(全)

    日期类一般面试的时候都是只给15到25分钟左右的时间来实现 所以要完成必要的几个功能函数 define CRT SECURE NO WARNINGS 1 include
  • clang静态分析器

    补充 centos7 8安装llvm7 https www liangzl com get article detail 20723 html clang 中文 https www bookstack cn read clang llvm