源程序生成控制流图和du-path

2023-05-16

最近上《源代码分析技术》这个课,老师让写一个程序,由一段c代码,生成生成控制流图和du-path,控制流图不用解释了,说一下du-path,这个术语是针对变量来说的,对于一个变量,它在使用时,分析之前的定义,如果该变量在定义和使用过程中都没有被再定义,则从定义到使用的路径成为一条du-path。

1.使用lex和yacc

网上源代码很多,主要说一个我的修改

首先,要画控制流图,要找到关键字-while if for之类的有断点意义的词,在词法分析器中把这类词分出来

在语法分析阶段,匹配部分,判断,有下列情况:

  1. 函数+变量-》使用
  2. 变量1+“=”变量2-》:使用变量2,定义变量1
  3. 变量1+"="数字-》:定义变量1
  4. 变量1+“== / !=”数字-》使用变量1
  5. 变量1+“== / !=”变量2-》使用变量1、使用变量2
  6. 变量1“+-*/”变量2-》使用变量1、使用变量2
  7. 变量1“+-*/”数字-》使用变量1
  8. 当然,还有别的,没有全部列出

之后,生成的文件就是包含“关键字”和使用定义变量信息的表

在读取du-path的时候,从下往上匹配就行

画控制流图的时候,注意堆栈信息处理,把分析出的结果一次压栈,遇到一个}就匹配,如果是if语句,先扫描下面的语句是否有else,如果有,创建三个节点,if、if成立的代码、else,并且建立一个虚节点,作为if节点的退出节点,如果没有else,只需创建两个节点就行,再创建一个出口节点。

if判断完之后,创建一个合并节点,并且当做普通语句压回栈中

如果遇到的是while,则创建两个节点,一个内容节点,一个while节点,并且将两个节点分别连接(这个是相对别的而言的,其他语句只需要单箭头)

当栈空的时候就是完成匹配了

最后,用graphviz工具画出流程图即可

 

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

源程序生成控制流图和du-path 的相关文章

  • 如何修复此错误:[WinError 267] 目录名称无效:

    我有一个 python 脚本 它创建一个 GUI 应用程序 在用户选择路径后显示现有文件的列表 系统显示在QlistWidget文件名及其父文件夹 我想从列表中获取所选文件的完整路径 例子 C Users test Desktop test
  • 获取当前文件夹路径

    我想创建一个转换文件的程序 我希望用户能够将可执行文件放在任何目录中 并且在执行该程序时 双击 exe 我希望该程序能够处理exe 文件所在的当前文件夹中的所有文件 程序如何确定当前执行的路径 I tried System Windows
  • 从物理路径获取相对虚拟路径

    如何从asp net中的物理路径获取相对虚拟路径 相反的方法如下 Server MapPath Virtual Path Here 但是上面的方法的逆过程是什么呢 Maybe 这个问题 https stackoverflow com que
  • $PATH 中 /usr/bin 和 /usr/local/bin 等的顺序

    在我的 Mac 上 我经常使用 bash 对于我的环境设置 我添加了 usr bin and usr local bin into PATH就像我平常做的那样 虽然我知道什么 usr bin and usr local bin关于 我很好奇
  • 计算MKPolyline路径的距离?

    我想获取 MKPolyline 路径的米数 以便我可以告诉用户完成路径还剩多少米 我一直在寻找一些东西来做这件事 但我什么也没得到 Thanks 尽管听起来很乏味 但除非您想自己进行数学计算 否则您可能必须迭代该行的思想points 将每个
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • python:获取上两层目录

    好吧 我不知道模块在哪里x是 但我知道我需要向上两层目录的路径 那么 有没有更优雅的方法 import os two up os path dirname os path dirname file 欢迎提供适用于 Python 2 和 3
  • 如何在 Windows 10 中将文件夹添加到“Path”环境变量(带有屏幕截图)

    在 StackOverflow 和整个网络上 关于如何将特定文件夹添加到 Windows 10 的指南已经过时且很少Path用户的环境变量 我认为针对新开发人员的完整指南 包含分步说明和屏幕截图 对于帮助他们从命令提示符 https upl
  • C# 获取资源文件夹路径

    我的项目中的一些资源很好 并且使用字符串路径可以正常工作 但是如果我将项目移动到另一个目录或另一台计算机 它将停止工作 请我需要在字符串变量中获取项目资源文件夹的路径 像这样的东西 C Users User1 Documents
  • Javascript:通过将路径作为字符串传递给对象来获取对象的深层值[重复]

    这个问题在这里已经有答案了 可能的重复 使用字符串键访问嵌套的 JavaScript 对象 https stackoverflow com questions 6491463 accessing nested javascript obje
  • 如何在 Jenkins 声明式管道中设置 PATH

    在 Jenkins 脚本化管道中 您可以像这样设置 PATH 环境变量 node git url https github com jglick simple maven project with tests git withEnv PAT
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • Excel的解析路径

    其实我想问以下问题 对于位于 目录中定义的 PATH 怎么能 我找出这些目录中的哪个 找到了 因为我需要使用 Process Run 从 C 运行 Excel 并且只需指示 Excel 即可正常工作 Windows 似乎知道在哪里可以找到它
  • 捆绑 pathsForResourcesOfType:inDirectory:

    在我的应用程序中 我有很多图片 分为几个类别 以下是项目内和我的硬盘上的应用程序树 ApplicationName Resources Thumbs Images Buttons Default png 在拇指文件夹中 我有很多 png 文
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录
  • Cmake 错误:无效的转义序列 \U

    使用 CMake 在 VC 10 中运行 OpenCL 代码时 出现以下错误 CMake Error at CMakeLists txt 6 set Syntax error in cmake code at C Users Shreedh
  • 节点未找到全局模块

    所以我意识到这是一个相当通用的标题和问题 但我已经搜索了很多答案 但遗憾的是它们似乎都不适合我 我希望通过我自己提供更多信息 也许有人有一个具体的答案 或者确切地知道将我重定向到哪个答案 我的问题 当我全局安装节点模块时 例如npm ins
  • svg路径指针事件-点击检测

    我正在编写一些 HTML 以便可以使用 HTML SVG 和 PATH 标签绘制贝塞尔曲线 我的曲线效果非常好 现在我想添加一项功能 如果用户将鼠标悬停在曲线上 我会更改颜色 但实际情况是 SVG 创建了一个包含路径的大框 并捕获所有点击
  • 全部配对图表上的所有路径

    这可能是一个没有最佳解决方案的问题 假设我有一个有向图 不知道它是否有循环 循环检测将是这个问题的方面之一 给定一组顶点 可能是数百万个顶点 我需要计算给定图的所有唯一对之间的所有不同路径 没有重复顶点的路径 我该如何应对这种情况 让我们看
  • Resharper 中的警告“未使用纯方法的返回值”

    我有一个关于我正在工作的 c 项目中从 Visual Studio 中的 Resharper 收到的警告的快速问题 警告是 不使用纯方法的返回值 发生这种情况的方法如下 private static bool FilePathHasInva

随机推荐

  • init进程详细分析--基于android 10

    init进程详细分析 概述 android设备上电 xff0c 引导程序引导进入boot 通常是uboot xff0c 加载initramfs kernel镜像 xff0c 启动kernel后 xff0c 进入用户态程序 第一个用户空间程序
  • commons-logging的使用

    简介 commons logging是Apache commons类库中的一员 Apache commons类库是一个通用的类库 xff0c 提供了基础的功能 xff0c 比如说commons fileupload xff0c common
  • 年度最理性 AI 分析文章:预测 AI 未来,大部分人陷入了 7 大误区

    来源 xff1a 36氪 概要 xff1a 错误的预测会导致大家对不会发生的事情感到恐惧 为什么在人工智能和机器人的预测上总有人不断犯错呢 xff1f 想着预测未来 xff0c 却一不小心就陷入了yy 近年来图像识别突破 Waymo无人车上
  • slf4j的使用

    OK xff0c 现在我们来使用slf4j 概念 SLF4J xff0c 即简单日志门面 xff08 Simple Logging Facade for Java xff09 xff0c 不是具体的日志解决方案 xff0c 它只服务于各种各
  • Java日志管理最佳实践

    原文出处 xff1a http www ibm com developerworks cn java j lo practicelog 感谢原作者 xff0c 感谢ibm网站 xff0c 里面有好多的精华帖 日志记录是应用程序运行中必不可少
  • MySQL数据类型--浮点数类型和定点数类型

    MySQL中使用浮点数类型和定点数类型来表示小数 浮点数类型包括单精度浮点数 xff08 float型 xff09 和双精度浮点数 xff08 double型 xff09 定点数类型就是decimal型 OK xff0c 现在我们来看看这几
  • MySQL数据类型--日期和时间类型

    MySQL中的多种时间和格式数据类型 日期和时间类型是为了方便在数据库中存储日期和时间而设计的 MySQL中有多种表示日期和时间的数据类型 其中 xff0c year类型表示时间 xff0c date类型表示日期 xff0c time类型表
  • MySQL数据类型--二进制类型

    二进制类型是在数据库中存储二进制数据的数据类型 二进制类型包括binary xff0c varbinary xff0c bit xff0c tinyblob xff0c blob xff0c mediumblob xff0c longblo
  • 单行注释和多行注释

    我们在实际编码中 xff0c 总是需要为程序添加一些注释 什么是注释 xff1f 注释就是一段文字 xff0c 这段文字并不是必须的 xff0c 也不直接参与代码运行 注释用来说明某段代码的作用 xff0c 或者说明某个类的用途 xff0c
  • Integer源码解析

    这篇博客我来整理下以Integer为例整理下包装类的源码 首先来看一段代码 xff1a public class LinkinPark public static void main String args Integer a 61 1 I
  • 不可变类

    不可变类 先来科普2个概念 xff0c 可变类和不可变类 1 xff09 xff0c 不可变类的意思就是创建该类的实例后 xff0c 该实例的实例变量是不可改变的 Java提供的8个包装类和String类都是不可变类 xff0c 当创建他们
  • 博客迁移<a>jiangweili.me</a>

    各位 xff0c 我的博客已经迁移 xff0c 具体请移步新博客地址 我会重新整理JavaSE和JavaEE相关 xff0c 最后搭建自己的一套web框架 xff0c 谢谢各位
  • Mac环境下localhhost无法访问

    今天访问本地服务器 localhost 提示无法访问 查看apache 错误日志最后一行提示以下错误 于是经过百度 搜索 34 AH00045 child process 1409 still did not exit sending a
  • RNAseq---Hisat2 标准输出中比对率信息解读

    RNA Seq Hisat2 标准输出中比对率信息解读 本文具体解释部分 xff08 一 xff09 中内容复制自Biostar内容 xff0c 后面附上我实际的例子 xff0c 二者略有不同 xff0c 整体理解上没大问题 xff0c 有
  • 解决Android单个dex文件不能超过65535个方法问题

    一 找坑 xff1a 谷歌规定单个dex文件中的方法不能超过65536的限制 我们编写项目过程中在工程的lib文件夹下引用的第三方插件jar包太多 或者项目过大 xff0c 编译运行时就有可能报出com android dex DexInd
  • Decode Ways问题及解法

    问题描述 xff1a A message containing letters from A Z is being encoded to numbers using the following mapping 39 A 39 gt 1 39
  • Android性能优化(一)内存泄露优化(静态变量、单例模式、属性动画)

    内存泄露优化分为两个方面 xff0c 一方面是在开发过程中避免写出有内存泄露的代码 xff0c 另一方面是通过一些分析工具比如 MAT来找出潜在的内存泄露继而解决 一 静态变量导致内存泄露 一般情况下静态变量引用了或者内部持有Activit
  • 图论 —— 图的连通性 —— Tarjan 求强连通分量

    概述 Tarjan 算法是基于对图深度优先搜索的算法 xff0c 每个强连通分量为搜索树中的一棵子树 搜索时 xff0c 把当前搜索树中未处理的节点加入一个堆栈 xff0c 回溯时可以判断栈顶到栈中的节点是否为一个强连通分量 基本思路 定义
  • 开发日记(一)

    这是自己编程第二天 xff0c 自己解决了好几个问题 xff0c 觉得很有成就感 xff0c 决定写下以后开发中遇到的问题 1 在多个Activity中传递数据 xff0c 之前只学过绑定基本的putExtra xff0c 今天上网一搜 x
  • 源程序生成控制流图和du-path

    最近上 源代码分析技术 这个课 xff0c 老师让写一个程序 xff0c 由一段c代码 xff0c 生成生成控制流图和du path xff0c 控制流图不用解释了 xff0c 说一下du path xff0c 这个术语是针对变量来说的 x