高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作

2023-11-02

系列文章目录

高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作
高效阅读嵌入式源码系列二:understand阅读linux、uboot等源码
高效阅读嵌入式源码系列三:understand阅读经keil MDK编译的源码



前言

之前一直使用source insight 4阅读C程序源码,非常喜欢它的context与relation,可惜source insight不能过滤复杂的条件编译(会干扰对源码的理解)。机缘巧合之下,从知乎中获知了understand这个静态分析神器,经几个月的使用,不断阅读各位同仁前辈的文章,加速对understand的熟悉。目前,已基本从source insight转战于understand了。下面,结合各位同仁前辈的文章,将近期使用understand做一个总结,记录于此。

一、understand是什么?

understand是Scitools的产品,目前可找到v6.1版本的下载版,本系列文章以understand v6.1为示例,v6.1 如何下载与安装请自行百度。
understand具有以下几个特点:

  1. 支持多语言:Ada, C, C++, C#, Java, FORTRAN, Delphi, Jovial, and PL/M ,混合语言的project也支持;
  2. 多平台: Windows/Linux/Solaris/HP-UX/IRIX/MAC OS X
  3. 代码语法高亮、代码折迭、交叉跳转、书签等基本阅读功能。
  4. 可以对整个project的architecture、metrics进行分析并输出报表。
  5. 可以对代码生成多种图(butterfly graph、call graph、called by graph、control flow graph、UML class graph等),在图上点击节点可以跳转到对应的源代码位置。
  6. 支持Perl API、python,便于扩展。
  7. 内置的目录和文件比较器。
  8. 支持project的snapshot,并能和自家的TrackBack集成便于监视project的变化。

二、导入项目

导入项目有两种方法,一种是从菜单栏点击File–>New–>Project,另一种是点击下面界面中间的New Project。
在这里插入图片描述
点击后,会进入到如下界面,你可以点击Add Directory添加需要阅读的源码目录,添加目录后点击continue进入下一步。
在这里插入图片描述
在如下出现的界面,选择No.
在这里插入图片描述
在出现的 create your understand project,勾选Configure advanced settings after project creation。同时,选择好将工程保存的位置与工程名字,方便下回阅读源码时open工程。点击Create Project进入下一步。
在这里插入图片描述
稍等几秒钟,会弹出如下界面,对本工程进行配置。
在这里插入图片描述
首先,对本工程涉及的编程语言进行设置,uboot一般涉及到汇编、C等。
在这里插入图片描述
接下来对Files进行配置。像uboot这类大型源码工程,最好精准添加本工程涉及的源文件,不然understand在分析时会卡死(原因是本工程无关源文件太多会导致静态分析太慢)。故,如何精准添加本工程所需的源文件,是值得思考的问题,这将是下一篇文章的内容了,今天聚集于如何使用understand。
点击Files下上部的第二黑色小块,如下图,点击Import a list of files…
在这里插入图片描述
便可导入本工程所需文件的txt(如何生成该txt文件见下一篇文章)。
在这里插入图片描述
下一步设置File Options,主要设置本工程所用的编码格式,一般选择UTF-8。
在这里插入图片描述
接下来,就是针对各编程语言设置编译器类型了。在C++中的Options中,设置分析模式Strict或Fuzzy,一般精准分析Strict。然后是Compiler编译器,有GCC、GNU GCC、Keil arm、IAR ARM等,各位根据需要进行选择。
在这里插入图片描述
还可选择编程语言的标准版本,本工程在Language Standard中选择C99标准。
点击OK,跳出是否开始分析工程的提示框,点击Yes.understand将分析本工程。
在这里插入图片描述
如果将本工程所需文件精准地添加进来后,分析过程会很快,一般为几十秒。understand界面的左下角会显示分析进度与警告、错误等信息。
在这里插入图片描述
警告与错误信息,大多错误一般是某些库某些文件未添加至工程中,如C函数库、类型定义等,各位自己根据情况进行处理。
分析完成后,左侧会出你的项目结构,即Project Browser,中间出现你项目的名称,此时你可以操作左面项目来查看相关代码,如下图所示:
在这里插入图片描述
这么多文件如何快速定位,那肯定是搜索,该软件针对不同位置,不同属性有不同的搜索方法,下面介绍搜索功能。

三、 搜索功能

  1. 左侧项目结构中搜索
    在这个搜索中你可以快速搜索你要查看的文件。快捷键,鼠标点击左侧上面项目结构窗口,然后按Ctrl + F 键会出现如下图所示的搜索框,在框中输入你想要的文件名回车即可打开文件。
    在这里插入图片描述
    在打开的文件的左上角有个 { }… ,点击可选择要阅读的函数名。
    在这里插入图片描述
    同时,可通过view->Scope List打开scope list。
    在这里插入图片描述
    点击scope list函数名,就可在Previewer中看到该函数的实现。
    在这里插入图片描述
  2. 函数方法与变量搜索
    将鼠标定位到右侧代码中,点击Ctrl + F,会弹出搜索框,输入函数方法或变量名 回车即可:
    在这里插入图片描述
  3. 在文件中搜索,也就是全局搜索
    在右侧文件中右侧点击,选择Find in便可选择搜索的范围:本工程or工作空间 等等。
    在这里插入图片描述

快速搜索是软件快速使用必备的技能,包括我们常用的source insight 4一样,快速定位方法,常量等,可以快速帮助我们解决问题。

understand可以绘制流程图等功能,下面就针对这个功能介绍一些图形的绘制功能,帮助你快速分析代码。

四、项目视图

项目视图包含很多的功能,能够自动生成各种流程图结构图,帮助你快速理清代码逻辑、结构等,以便快速理解项目流程,快速开发,视图查看方式有两种,一种是鼠标点击你要查看的函数方法上面,然后右键弹出菜单,鼠标移动到Graphical Views,然后弹出二级菜单,如下图所示
在这里插入图片描述
或者,另一种方式是点击要查看的函数方法,然后找到代码上面菜单栏中的如下图标:然后点击图标右下角的下拉箭头,弹出如下菜单,即可选择查看相关视图
在这里插入图片描述

  1. Butterfly
    如果两个函数间存在关系,就显示这两个函数间的调用和被调用关系:如下图,image_setup_linux函数的关系图。
    在这里插入图片描述2. Calls
    展示从你选择这个函数开始的整个调用链条。
    在这里插入图片描述3. Control Flow
    你选择的这个函数的控制流程图,帮助我们理解某个函数的实现。
    在这里插入图片描述4. UML Sequence Diagram
    展示函数间的时序关系图
    在这里插入图片描述以上几个是我们常用的关系图,剩下几个各位可自行探索、使用。

注意

以上各类项目视图中,均可点击某个函数名,在Previewer中查看其实现。如:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

题外话

各位看官,看到这是不是感觉到understand的强大,一个关系图就可将函数间的关系理得很顺,更别说条件编译的过滤了(未满足条件编译的直接蒙板显示,如下图)。更何况还有流程图、时序图等(还有其他有助于我们理解源码的功能待大家去发掘使用,懂的人自会爱上这款软件。
在这里插入图片描述

五、常用窗口视图

下面介绍常用的几个view.

  1. Previewer
    这个类似source insight 4的context window,欲查看某个函数的实现或变量在哪定义,便可 Ctrl+左健单击 即可在Previewer中查看。如下图image-setup_linux示例
    在这里插入图片描述有Previewer非常香,从source insight 4迁移到understand的成本便会低很多。
    注意:左键单击某个函数或变量时,会在Prewviewer中显示,左键双击则会在右侧主窗口中显示。
  2. Scope List
    之前在介绍搜索功能时,提过ScopeList,这方便我们快速地查看某个函数。注意,左键单击某个函数名时,会在Previewer中显示;左键双击则会在右侧主窗口中显现。
    在这里插入图片描述3. Project Browser
    这个就不用多说了,查看某个工程的所有文件的,可单击快速查看某个文件。
    在这里插入图片描述

六、总结

以上只是对understand做个入门介绍,更多功能还是靠自己去使用、去查看各个功能视图的展示结构以及作用。软件,工具而已,孰能生巧,多操作几下就会了,所以不再做过多的解释。最终希望这款软件能够帮助你快速开发,快速阅读别人的或者自己的代码。

注:
本文参考了这篇博客,非常感谢该文作者,谢谢。
Understand:高效代码静态分析神器详解

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

高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作 的相关文章

随机推荐

  • PCB设计_Via过孔和PAD焊盘

    PCB的四周一般会设计增加机械孔用于固定PCB板 增加整体结构的稳定 但是机械孔的设计往往在新手的设计中会出现许多问题 而且DFM检查还不一定可以检查出来 那么针对机械孔 金属化和非金属化 两种的设计 下面将会讨论 1 金属化机械孔 这里不
  • Vue刷新浏览器后重定向到首页或者某一个页面

    记录一下项目需要的一些小优化 刷新浏览器时回到首页 一般来说vue项目刷新浏览器之后还会继续跳动刷新之前的页面 我们只需要要App vue中的created方法中添加相关判断即可 这里的 index可以换成具体需要跳转的页面 具体代码如下
  • [深度学习] Relu层作用

    为什么引入非线性激励函数 如果不用激励函数 在这种情况下你每一层输出都是上层输入的线性函数 很容易验证 无论你有多少层神经网络 输出的都是输入的线性组合 激活函数是用来加入非线性因素的 因为线性模型的表达能力不够 以下 同种颜色为同类数据
  • 如何删除 MySQL ⽤户

    1 登录MySQL数据库 登录MySQL数据库 可以使 以下命令 mysql u 户名 p 2 查看当前 户 使 以下命令查看当前所有 户 ysql user 3 删除 户 在MySQL数据库中 删除 户需要使 DROP USER命令 以下
  • Python快速搭建HTTP服务

    欢迎关注 无量测试之道 公众号 回复 领取资源 Python编程学习资源干货 Python Appium框架APP的UI自动化 Python Selenium框架Web的UI自动化 Python Unittest框架API自动化 资源和代码
  • Tomcat 启动时,/logs/catalina.out: No such file or directory

    如果报这个错请查看是不是Tomcat包下载错了 注意 要下载Core 中的tar gz 如果Tomcat包正确请继续往下看解决方案 解决方案 touch cannot touch opt apache tomcat 7 0 93 src l
  • android动态设置maxheight,android - 如何在TextInputLayout上设置maxHeight - 堆栈内存溢出...

    我不想限制行数 我想限制TextInputLayout最大高度 这样 如果它太长 它将变为垂直滚动 我很好的代码解决方案 当前maxHeight属性对TextInputLayout或EditText无效 这是我的布局 xmlns app h
  • GB28181 对接海康平台,解决音视频卡顿问题

    GB28181 对接海康平台 解决音视频卡顿问题 一 概述 二 问题分析 1 设备对比分析 2 抓包对比分析 3 验证分析结果 三 总结 四 讨论 一 概述 设备使用GB28181协议对接海康平台时 发现音频和视频存在卡顿现象 不是一直卡顿
  • 程序分层领域模型规约中各种实体类命名(DO、BO、DTO、VO)的意义

    仅做参考 DO Data Object 与数据库表结构一一对应 通过DAO层向上传输数据源对象 DTO Data Transfer Object 数据传输对象 Service或Manager向外传输的对象 BO Business Objec
  • 期货开户一心一意坚持到底

    只有真正了解了自己的性格 那么离寻觅到适合自己性格的交易法则也就不远了 只有专注 一心一意的做某件事情 才能做到无困无惑 如果三心二心 那么最终只会一事无成 大道至简 坦然面对自己人性的弱点 才能做到交易简单 生活快乐 其实一时的坚持非感觉
  • npm run build:prod报错:events.js:291 throw er; // Unhandled ‘error‘ event处理办法

    解决办法 1 CTRL R输入cmd 2 在命令行输入 netstat ano findstr 8080 3 找到占用的PID号 进行查找 tasklist findstr 16504 4 CTRL SHIFT DELETE打开任务管理器
  • Qt: error: C2001: 常量中有换行符

    这里简单记录在使用Qt Creator时遇到的一个问题 如下一行代码 没有任何问题 但编译运行时会报错 label gt setText label 我是一个窗口 当使用中文时 可能会习惯性的使用QObject tr 函数 label gt
  • 文件查重FindDupFile

    finddupfile是网上用的比较多的一款绿色查重软件 具体步骤请参考以下 1 下载软件 可从网上下载该软件 或者从以下地址进行下载 本软件从网上可自行下载 下载链接 https pan baidu com s 1KDJ9U4U 8HQa
  • 数学分析闭区间套定理_什么是区间套定理?

    什么是闭区间 数轴上任意两点和这两点间所有点组成的线段为一个闭区间 闭区间套定理 有无穷个闭区间 第二个闭区间被包含在第一个区间内部 第三个被包含在第二个内部 以此类推 后一个线段会被包含在前一个线段里面 这些区间的长度组成一个无穷数列 如
  • FineReportV10.0入门

    第三章 报表属性设计基础 第三课层次坐标 常用公式
  • gitlab CI/CD自动化部署

    文章目录 1 gitlab Runner 1 1 安装gitlab Runner 1 2 注册runner 2 gitlab ci yml的书写 3 部署 3 1 docker方式部署 3 2 OSS部署 CI CD 是一种持续开发软件的方
  • 针对QT——“在程序文件中(*ui,*cpp,*h)更改之后编译运行的程序结果无法更新”——解决方案

    本篇文章主要介绍在QT中 对程序文件 ui cpp h 更改之后编译运行的程序结果却无法更新的解决方案 问题描述 在设计QT的GUI用户界面时 我们需要不断对程序文件进行修改以优化用户体验 因此需要更新程序的生成文件 实际经历 笔者最近在一
  • IntelliJ Spring Configuration Check

    用IntelliJ 导入现有工程时 如果原来的工程中有spring 每次打开工程就会提示 Spring Configuration Check 开始不知道怎么回事 但工程不影响 首先到工程设置界面 工程设置 Project Structur
  • 1-APP启动源码分析-1

    桌面app也就是我们认识的launcher app 点击app icon启动到app内部的过程分为2种情况 一种是冷启动 一种叫热启动 冷启动 系统没有创建过app的进程 也就是后台没有此app进程 所以冷启动系统会创建一个新的进程分配给a
  • 高效阅读嵌入式源码系列一:静态分析神器understand软件基本操作

    系列文章目录 高效阅读嵌入式源码系列一 静态分析神器understand软件基本操作 高效阅读嵌入式源码系列二 understand阅读linux uboot等源码 高效阅读嵌入式源码系列三 understand阅读经keil MDK编译的